Indianerchat mit vielen Cowboys...

Apache, Lighttpd, nginx, Cherokee
arcade
Posts: 9
Joined: 2011-03-14 17:37

Indianerchat mit vielen Cowboys...

Post by arcade » 2011-03-14 17:49

Ein Thema, dass hier schon in diversen Formen diskutiert wurde, und mit einer Suche "Performance", "Tuning" oder "High Performance" kommt so eniges, aber summa sumarum nicht das was ich konkret brauche.

Problemstellung: Es muss innerhalb von sehr kurzer Zeit ein Chatserver (php, mysql5) aufgesetzt werden, der a) ab einem gewissen zeitunkt innerhlab einer sekunde 1000de von Zugriffen neu registriert, und dauerhaft über 500 user gleichzeit in chatrooms hält, während neue sich anmelden und mails per sendmail rausgehn... Als Gundlage dient ein Quadcore mit 4GHz, 8GB Ram. Müsste doch reichen, oder?
Die Einrichtung kann nur einmal gemacht werden, dann geht es auch schon los, und es darf keinen Fehler geben. Die Einrichtung muss top sein, und ehrlichgesagt, als Apache, bin ich nicht alt genug...

Ich vertraue auc Apache, weil er flexible einsetzbar ist und skalierbar. Ausserdem ein Quasi Standard auf einem Debian System.

Welche Einstellungen könnt ihr empfehlen. bzw. wie soll ich diesen Webserver aufsetzen? BIsher habe ich immer eine Standardinstallation gemacht und die Werte in der .conf etwas nach oben gesetzt. Doch nun, bei dieser Aufgabe, muss alles rausgeholt werden...
Ich lese mich detaillierter in das Thema ein, und hoffe unterdessen hier wichtige Tips, Ideen und Hinweise zu bekommen.

User avatar
rudelgurke
Posts: 405
Joined: 2008-03-12 05:36

Re: Indianerchat mit vielen Cowboys...

Post by rudelgurke » 2011-03-14 18:45

Oh je - dass hängt sicherlich auch stark von der eingesetzten Chat Software ab. Wenn die Müll ist und lustige MySQL Abfragen bastelt bringt der schnellste Webserver nichts.
Generell gilt, alles was nicht benötigt wird rausnehmen (Apache Module) und - falls es die Chat Software erlaubt - eine Warteschleife einlegen dass z. Bsp. nur aller 5 Sekunden jemand etwas posten darf.

arcade
Posts: 9
Joined: 2011-03-14 17:37

Re: Indianerchat mit vielen Cowboys...

Post by arcade » 2011-03-14 18:55

Zur Chat Software lässt sich nicht viel sagen, ausser dass sie sehr einfach ist und recht optimal läuft. Das Problem ist vielmehr der Häuptling. Die ganzen Prozesse die sich plötzlich generieren müssen, evtl. mehr als nur ein prozes por sekunde. Es wird eine Art Banner auf mehreren sehr hochfreq. Seiten angezeigt (synchron) und ab da gehen die Zugriffe von 0 auf 400%. Ähnlich einer DOS Attacke. Wie soll man das abfangen... besser, wie kann den Webserver dafür konfigurieren ? Welche Einstellungen haben sich bewährt..., um dennoch eine Menge konstanter Verbindungen halten?
Last edited by arcade on 2011-03-14 18:59, edited 1 time in total.

arcade
Posts: 9
Joined: 2011-03-14 17:37

Re: Indianerchat mit vielen Cowboys...

Post by arcade » 2011-03-14 20:10

Danke Matze.

Ich weiss, dass nichts über Benchmark und ausgiebiges Testen geht. Das Problem ist leider die mangelnde Zeit. Gibt es nicht da nicht Erfahrungswerte die man empfehlen kann? ZBsp.: mpm-worker mit folfenden einstellungen . zack!. Sowas wäre ein Anfang.
Ich versteh nicht ganz was mit architektonisch ein horizontales skalieren berücksichtigen? und vertikale Skalierung? Es gibt nur diese eine Kiste und diesen einen Versuch den Server einzustellen. Schlägt das fehl. Game over.

Roger Wilco
Administrator
Administrator
Posts: 5924
Joined: 2004-05-23 12:53

Re: Indianerchat mit vielen Cowboys...

Post by Roger Wilco » 2011-03-14 20:39

arcade wrote:Gibt es nicht da nicht Erfahrungswerte die man empfehlen kann?

Das hängt von der eingesetzten Chat-Software ab. Bei den Keywords PHP und MySQL für einen Realtime-Chat sehe ich jedoch eher dunkle Wolken aufziehen.

arcade wrote:ZBsp.: mpm-worker mit folfenden einstellungen . zack!.

Aktueller Apache httpd, Event MPM, keine interpretierende Skriptsprache bzw. falls erforderlich mit Opcode-Cache.

arcade wrote:Es gibt nur diese eine Kiste und diesen einen Versuch den Server einzustellen. Schlägt das fehl. Game over.

Ah, du spielst also gerne Roulette.

Ich verstehe nicht, weshalb man ungeeignete Technologien einsetzen möchte, wenn skalierbare und geeignete Technologien (XMPP, BOSH, MUCkl/Tigase-MUC) existieren.

arcade
Posts: 9
Joined: 2011-03-14 17:37

Re: Indianerchat mit vielen Cowboys...

Post by arcade » 2011-03-14 22:44

Vielen Dank. Das sind gute Antworten, man merkt, dass ihr euer Territorium kennt. Ich lerne auch wieder was dazu... @Roger - es gibzt mit Sicherheit geeignetere techniken, für alles gibt es immer etwas passenderes, aber leider weder das wissen noch die zeit auf andere technologien oder gar protokolle umzumünzen... belassen wir es bei der aussage "ich kann nur apache", ok?
Zum Thema horizontale und vertikale Skalierung hatte ich mir ähnliches schon gedacht - Danke Matze. Das kommt aber erst später in Frage. Jetzt muss es schnell gehn... und das was zur Verfügung steht wurde genannt. I need an advice....

Was ich bisher habe:
- server minimal installieren, nur das nötigste
- beim apache: mpm-worker arbeite schneller und kann mehr prozesse gleichzeitig bedienen mit weniger speicher
- alle (un)möglichen module deaktiviern: gebraucht werden mod_php und mod_rewrite, mod_cache ist gut
- ähnliches gilt für php, evtl. eAccelerator installieren
- mysql buffer gering halten

Was ist mit dem Fine Tuning? Wieviele Server starten, wieviele prozesse bereithalten für den Ansturm. Timeout, KeepAlive, wie lange? Erfahrungswerte müssen doch bestehen, womit man gut die Situation meistern kann. Es gibt keine Musterlösung, aber Tipps... hoffentlich?

ps: Es ist kein Businessplan in dem sinne.
Das mit dem Roulette fand ich echt treffend :)
Last edited by arcade on 2011-03-14 22:52, edited 2 times in total.

dotme
Posts: 150
Joined: 2004-12-15 16:48

Re: Indianerchat mit vielen Cowboys...

Post by dotme » 2011-03-14 22:45

Und warum verwendet man nicht einfach übliche Techniken für den Chat-Bereich (IRC/XMPP) und setzt da eine schlanke Event-basierte (twisted/nodes.js) lösung obendrauf? Das bunte drumherum kann ja gerne vom Apache kommen?

arcade
Posts: 9
Joined: 2011-03-14 17:37

Re: Indianerchat mit vielen Cowboys...

Post by arcade » 2011-03-14 22:50

dotme wrote:Und warum verwendet man nicht einfach übliche Techniken für den Chat-Bereich (IRC/XMPP) und setzt da eine schlanke Event-basierte (twisted/nodes.js) lösung obendrauf? Das bunte drumherum kann ja gerne vom Apache kommen?

Der Chat ist Teil einer communitysoftware in php5. Hört sich komisch an, ist aber so.

Hey, der der Hinweis auf node.js ist hochwertigr. Auf der Request Ebene selbst lässt sich schon einiges vorbereitend machen. Guter Schuss.
Last edited by arcade on 2011-03-14 23:00, edited 1 time in total.

arcade
Posts: 9
Joined: 2011-03-14 17:37

Re: Indianerchat mit vielen Cowboys...

Post by arcade » 2011-03-14 23:09

matzewe01 wrote:Sinnigerweise stellt man die max. Threads etwas höher als man es erwartet.
Wenn Du von 500 gleichzeitigen Verbindungen aus gehst, dann solltest Du für Spitzenzeiten 750 einplanen. Ich bin aber nach wie vor der Überzeugung, dass php und mysql das bootleneck darstellen werden.
Anstarten solltest Du ggf. zwischen 150 - 200 und 300 im bedarfsfall min. am leben halten.

Wir kommen endlich zum Kern der Diskussion ;)

matzewe01 wrote:Das sind Dinge, die Du vorher grob abstecken musst.
Mit den 1000 oder 500 kannst Du nichts anfangen, sind das Spitzenwerte? Soll das der Tagesdurschnitt sein oder handelt es sich um 2/3 Durchschnitt?
... Anteil in % pro Tag.

Ich weiss es genau. Die Situation. Der Chat wird bei einer Fernsehsendung geschaltet. Plötzlich gehen 1000de Händies gleichzeitig auf den Chat, um Punkt 20 uhr. Die requests steigen von 4 auf 400 pro sekunde.
Es melden sich neue User an, chatten los. Etwa 200 leute sind 4 stunden lan konstant im chat (refresh im 10 sekunden takt via ajax). In den folgenden stunden kommen weitere user dazu, während weiterhin zugriffe einprasseln. ich weis nicht wieviele, aber mindestens 120/sekunde.
Die Cowboys kommen alle aus dem Reservat Deutschland, wo auch der Apache wohnt.
Last edited by arcade on 2011-03-14 23:12, edited 1 time in total.

User avatar
Joe User
Project Manager
Project Manager
Posts: 11134
Joined: 2003-02-27 01:00
Location: Hamburg

Re: Indianerchat mit vielen Cowboys...

Post by Joe User » 2011-03-14 23:36

Für solche Fälle gibt es mitlerweile Amazons Dienste, die sollen sich schnell und einfach skalieren lassen. So ist der Ansturm fast egal und Du zahlst auch nur die wirklich benötigten Ressourcen. Inwiefern Amazon bereits fertige Setups anbietet, müsstest Du selbst eruieren, ich brauchte Amazon noch nicht selbst.
PayPal.Me/JoeUserFreeBSD Remote Installation
Wings for LifeWings for Life World Run

„If there’s more than one possible outcome of a job or task, and one
of those outcomes will result in disaster or an undesirable consequence,
then somebody will do it that way.“ -- Edward Aloysius Murphy Jr.

arcade
Posts: 9
Joined: 2011-03-14 17:37

Re: Indianerchat mit vielen Cowboys...

Post by arcade » 2011-03-15 09:58

Das bedeutet also, dass ich unbedingt auf Amazon EC2 ausweichen soll? Sicher eine akurate Lösung, auch schon dean gedacht... (bliebe noch die Überlegung, ob ich das in der Kürze der Zeit kann).
Naja, habe ja nicht unbedingt nach Alternativen gefragt, trotzdem Danke dafür. Vielleicht hätte ich von vorneherein die Situation anders darlegen sollen, um gezielt nach einer Apache Konfiguration für hohe Zugriffe zu fragen....
Ich werden versuchen meine Recherche-Ergebnis, wie ein Apache unter diesen Vorraussetzungen und speziell für eine solche (Extrem-) Situation gerüstet werden kann (das war die eigentliche Frage), hier am Ende zusammenzutragen.
Währenddessen bin ich für jeden weiteren Tipp zum Thema dankbar.
Last edited by arcade on 2011-03-15 10:02, edited 1 time in total.

User avatar
Joe User
Project Manager
Project Manager
Posts: 11134
Joined: 2003-02-27 01:00
Location: Hamburg

Re: Indianerchat mit vielen Cowboys...

Post by Joe User » 2011-03-15 11:05

Für Apache selbst solltest Du nach dem 10k-Problem googlen. Das wird Dir aber nicht wirklich helfen, da Du Dir mit AJAX selbst ins Knie geschossen hast. Und auch ohne AJAX wird es noch komplex genug, da eine eizelne MySQL-Instanz ziehmlich sicher nicht ausreichen wird und ich darauf wetten würde, dass Deine "Community-Software" nicht auf den Betrieb mit einem MySQL-Cluster ausgelegt ist, zumal Du dafür mehrere dedizierte Maschinen benötigst.

Mit EC2 kannst Du immerhin in kurzer Zeit das Problem der mehreren dedizierten Maschinen kostengünstig lösen, das Software-Problem bleibt aber bestehen. Einen echten Chatserver in EC2 zu werfen wäre die vernünftigste Lösung...
PayPal.Me/JoeUserFreeBSD Remote Installation
Wings for LifeWings for Life World Run

„If there’s more than one possible outcome of a job or task, and one
of those outcomes will result in disaster or an undesirable consequence,
then somebody will do it that way.“ -- Edward Aloysius Murphy Jr.

arcade
Posts: 9
Joined: 2011-03-14 17:37

Re: Indianerchat mit vielen Cowboys...

Post by arcade » 2011-03-15 12:22

Joe User wrote: [...], da Du Dir mit AJAX selbst ins Knie geschossen hast. Und auch ohne AJAX wird es noch komplex genug, ...

Das verstehe ich nicht. Wieso ins Knie geschossen? Somit wird einiges an Netzwerk-Ladung gespart.

Ich danke euch. @matzeweo1, ich stimme mit dem was sagst 100% überein.
trotz allem muss ich das nun durchziehn und rausholen was geht. Eine Musrterlösung auf den Silbertablett habe ich auch nicht erwartet, aber es wird klar, dass ein skalierbarer Dienst wie EC2 tatsächlich die beste Lösung ist.

User avatar
Joe User
Project Manager
Project Manager
Posts: 11134
Joined: 2003-02-27 01:00
Location: Hamburg

Re: Indianerchat mit vielen Cowboys...

Post by Joe User » 2011-03-15 13:00

Je nach Aufbau des AJAX werden die Verbindungen offengehalten (persistent) und somit die Slots des Apache nicht wieder freigegeben. Wenn der AJAX-Müll dann auch noch mehrere Verbindungen pro Client benötigt (nicht unüblich), dann ist schnell Essig für neue Chatteilnehmer. Gerade diese Community-Platformen weisen genau diese Denkfehler auf, da sie AJAX lediglich als Buzzword auf der Featurelist haben wollen und es ohne nachzudenken in ihre Oberfläche reinhacken. AJAX ist eine enorme Belastung für das darunterliegende System und keine Entlastung wie oft gerne behauptet. AJAX ist gut fürs Look&Feel des Users und schlecht fürs System, zumindest wenn es falsch implementiert ist und das ist leider allzu oft der Fall (auch bei uns im RootForum).

Naja egal, Du willst/kannst ja die Software nicht (temporär) austauschen, also kannst Du offenbar mit diesem Problem leben und wusstest schon vorher worauf Du Dich einlässt...

Um welche Community-Software handelt es sich denn nun, vielleicht kann man Dir da ja weitergehende Tipps zur Optimierung und/oder Drop-In-Replacements geben?
PayPal.Me/JoeUserFreeBSD Remote Installation
Wings for LifeWings for Life World Run

„If there’s more than one possible outcome of a job or task, and one
of those outcomes will result in disaster or an undesirable consequence,
then somebody will do it that way.“ -- Edward Aloysius Murphy Jr.

aquajo
Posts: 145
Joined: 2003-02-25 21:07

Re: Indianerchat mit vielen Cowboys...

Post by aquajo » 2011-03-16 08:44

Noch ein paar Gedanken von mir:
  • Versuch möglichst viel zu cachen
    • Bilder/CSS usw. von den clients cachen lassen (ausreichende Expires Header)
    • Falls bei der Anwendung sinnvoll machbar evtl. auch viele Anfragen schon bevor sie PHP erreichen (varnish o.Ä. vor den Apache, aber auch nur wenn es eine nennenswerte Hitrate bringt)
    • Falls die Anwendung Optionen hat zum cachen, nutzen
  • Mysql-Server schnell genug machen - Wenn die Daten nicht unbedingt überleben müssen komplett in eine RAM-Disk schieben

aquajo
Posts: 145
Joined: 2003-02-25 21:07

Re: Indianerchat mit vielen Cowboys...

Post by aquajo » 2011-03-16 12:40

So wie ich es verstanden habe steht der Softwarestack ja recht fest. (Ob das sinnvoll ist oder nicht sei dahingestellt - gab da ja auch schon andere Ideen in welche Richtung man da schauen könnte)

Je nach Art des "Chats" wären Datenverluste ja tragbar. Was man zumindest schauen sollte wie zeitnah (oder besser nicht zeitnah) die einzelnen Chatbeiträge und was in der DB sonst noch so "gelogt" wird auf Platte geschrieben werden. IO schreibend könnte ich mir sonst recht fix als Bottleneck vorstellen.
Last edited by aquajo on 2011-03-16 12:40, edited 1 time in total.

arcade
Posts: 9
Joined: 2011-03-14 17:37

Re: Indianerchat mit vielen Cowboys...

Post by arcade » 2011-03-18 12:50

Ich denke ich habe es geschafft. Müsste funktionieren. Das Ergebnis wird sich heut und morgen abend zeigen. Für alle die es interessiert, hier ein paar Details zur Konfiguration.

System
Debian 5 auf 2.4GHz Quadcore, 8GB RAM, raid 1
Apache 2 + mod_php, mod_deflat, mod_cgi u. mod_rewrite
Php5 extensions curl, gd, memcache, mysqli, xcache
mysql 5

apache2.conf
Nach einigen benchmarks habe ich auf wieder auf mpm-prefork geschaltet, da dadurch deutlich weniger failed requests aufgetreten sind.

Code: Select all

KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 3

<IfModule mpm_prefork_module>
    StartServers         30
    MinSpareServers      20
    MaxSpareServers      25
    ServerLimit         500
    MaxClients          400
    MaxRequestsPerChild 40000
</IfModule>

HostnameLookups Off

<Directory />
    Options FollowSymLinks
    AllowOverride None
</Directory>


my.cnf
Buffer so gering wie möglich und so gross wie nötig machen. Das muss je nach Software ausbalanciert werden. Ein gutes script das mit dabei geholfen hat war das wohl bekannte "tuning-primer.sh"

Code: Select all

key_buffer              = 64M
max_allowed_packet      = 8M
thread_stack            = 128K
thread_cache_size       = 12
max_connections        = 500
connect_timeout        = 12

table_cache            = 2M
thread_concurrency     = 8
concurrent_insert      = 2
low_priority_updates   = 1

query_cache_type = 1
query_cache_limit       = 1M
query_cache_size        = 2M

read_rnd_buffer_size = 2M
read_buffer_size = 2M
sort_buffer_size = 2M
join_buffer_size = 1M


Natürlich kommt es auch (vor allem) auf die eingesetzte php software an. Das muss sauber programmiert sein, und die Datenbankabfragen müssen optimiert sein (indices und joins - sehr wichtig), sowie auf eine gute Ajax implementation, mit timeout (danke JoeUser).

Im Benchmarking hält der Server weitaus mehr als 600 requests/sekunde konstant aus. Es wird nach ner Weile zwar etwas langsamer, aber mit kurzen keepAlives und ein paar überwachten restarts zwischendurch (monit) durchaus passabel.
Eaccelerator oder APC hat in meinem Fall nicht viel gebracht, kann aber deutliche Geschwindigkeitserhöhung zur Folge haben.
Sicher lässt sich hier und da auch noch etwas mehr rausholen. Und klar, es gibt geeignete Lösungen und Protokolle einen Chat umzusetzen, und Skalierung, egal ob EC2 oder eigen, bringt um einiges mehr.

Mais maintenant, Rien ne va plus!
Danke an alle, und Daumen drücken!
Last edited by arcade on 2011-03-18 12:54, edited 1 time in total.

User avatar
Joe User
Project Manager
Project Manager
Posts: 11134
Joined: 2003-02-27 01:00
Location: Hamburg

Re: Indianerchat mit vielen Cowboys...

Post by Joe User » 2011-03-18 13:22

Danke für die Zusammenfassung und viel Erfolg.

Bitte berichte anschliessend nochmal über etwaige Probleme und Optimierungen.
PayPal.Me/JoeUserFreeBSD Remote Installation
Wings for LifeWings for Life World Run

„If there’s more than one possible outcome of a job or task, and one
of those outcomes will result in disaster or an undesirable consequence,
then somebody will do it that way.“ -- Edward Aloysius Murphy Jr.