Optimale Werte für die Anweisungen ServerLimit, MaxClients, MaxRequestsPerChild

29

Ich betreibe eine verkehrsintensive Website mit vielen dynamischen Inhalten, die größtenteils von Nutzern erstellt wurden.

Der Server ist ein dedizierter Server und verfügt über insgesamt 4 Prozessoren mit Intel (R) Xeon (R) -CPU X3210 bei 2,13 GHz. Ich muss wissen, um optimale Werte für ServerLimit und MaxClients Apache-Anweisungen zu erhalten, wenn man bedenkt, dass der Server 4 GB RAM hat und die MySQL-Datenbank auf einem separaten Server ausgeführt wird. Das Panel ist DirectAdmin mit CentOS.

Im Folgenden sind meine aktuellen Anweisungen aufgeführt. In Spitzenzeiten mit mehr als 5.000 Benutzern wird jedoch eine erhebliche Verzögerung festgestellt - und dies ist nicht der einzige Fehler von MySQL, da Seiten anscheinend schnell generiert werden (ich habe einen Zeitzähler für die Seitenerstellung implementiert), aber es gibt einen langen Zeitraum Verbindungsverzögerung, bis die Seite zu reagieren beginnt und an den Browser gesendet wird.

<IfModule prefork.c>
    StartServers     800
    MinSpareServers   20
    MaxSpareServers   60
    ServerLimit      900
    MaxClients       900
    MaxRequestsPerChild  2000
</IfModule>
Timeout 90
KeepAlive On
KeepAliveTimeout 5

Ich sollte erwähnen, dass die Überwachung des Servers mit dem Befehl top die CPU-Auslastung in der Hauptverkehrszeit nie über 20% ~ 30% hinausgeht. Der MySQL-Server hat zu diesem Zeitpunkt auch eine Auslastung von 30 bis 50%, und ich arbeite ständig daran, langsame Abfragen zu beheben, aber das ist ein anderes Problem. Ich weiß, dass dies kein DB-Engpass ist, da das Laden statischer Seiten in Spitzenzeiten auch sehr lange dauert.

Tipps zur Optimierung dieser Werte sind dankbar.

andreszs
quelle

Antworten:

24

Ihre MaxClients ist viel zu hoch. Was ist die aktuelle Größe Ihres Apache-Prozesses? Multiplizieren Sie das x 900. Ist das größer als 4 GB? In diesem Fall wird die Maschine wahrscheinlich ausgetauscht. Normalerweise beginne ich mit MaxClients = 2x vCPUs in der Box (grep -c processor / proc / cpuinfo). Dies wäre in diesem Fall ungefähr 8. Stellen Sie dann sicher, dass die Größe des MaxClients x Apache-Prozesses 4 GB nicht überschreitet.

Abhängig von der Art der Verbindung, die Ihre Kunden haben, können Sie von dort aus Ihre MaxClients aufrüsten. (DFÜ-Benutzer müssen mit dem Löffel gefüttert werden usw.) Aber stellen Sie sicher, dass Sie sich nie in eine Tausch-Situation geraten.

Setzen Sie dann Ihre Server Min, Max und Start auf MaxClients. In einer dedizierten Serverumgebung müssen sie sich nicht unbedingt unterscheiden.

Dann mache ein paar Tests mit ab (als Gansnotizen).

Kippwagen
quelle
Aus irgendeinem Grund habe ich die Prozessgröße falsch bestimmt ... jetzt sehe ich im obersten Befehl, dass die Apache-Prozesse von RESIDENT SIZE im Bereich von 10 bis 15 MB liegen. Ich habe irgendwo gelesen, dass die "echte" Größe halb so groß ist, da gemeinsam genutzte Bibliotheken in dieser Nummer enthalten sind. In Anbetracht dessen sollte ich berechnen, dass ich 570 Prozesse mit einer Größe von jeweils 7 MB aufnehmen kann. Halten Sie das für richtig?
Andreszs
Ich schlage vor, Sie verwenden 15 MB für die Berechnungen und beginnen dann, die Metriken zu überprüfen: # http process vs. memory use. Dies gibt Ihnen eine bessere Vorstellung von der Anzahl der MaxClients
hdanniel
1
Ich habe es auf 400 gesenkt und schon vor der Spitzenstunde hatte das Ergebnis den gegenteiligen Effekt als gewünscht: Jeder niedrigere Wert als das Original erzeugt Zeitüberschreitungen und lange Verzögerungen. Tatsächlich habe ich es jetzt auf 1500 Clients erhöht und die Speichernutzung beträgt jetzt 3 GB, während die durchschnittliche CPU-Auslastung 8% beträgt. Natürlich ist jetzt mehr Last auf dem SQL Server und ich muss daran arbeiten.
Andrészs
Hier ist mein htop-Befehl: 1500 Apache-Prozesse und fast 100 Systemprozesse. Dies bei 75% der RAM-Auslastung. a.imagehost.org/0011/htop.png Sollten Sie Ihre Formel überdenken? ;)
andreszs
1
Aus diesem Grund müssen Sie Tests in Ihrer eigenen Umgebung durchführen. Wir haben HTTP-Beschleuniger vor unseren Apachen, damit sie keine mobilen Benutzer mit dem Löffel füttern. Ihre Anwendung scheint auch sehr leicht zu sein. Wenn Sie die Last in Ihre Datenbank verlagert haben, bedeutet dies, dass mehr dieser Apache-Prozesse tatsächlich Daten liefern, als auf eine MySQL-Verbindung warten. Was veranlasst mich dann zu fragen, wie viele Verbindungen Sie zu Ihrer DB zulassen? Übersteigt diese Anzahl Ihre MaxClients? Haben Sie 5.000 gleichzeitige Verbindungen? Wenn ja, möchten Sie vielleicht etwas wie Perlbal in der Front untersuchen.
Sturzwagen
5

Sie müssen die durchschnittliche Größe Ihres Apache-Prozesses ermitteln. Mit dieser Nummer und der Gesamtgröße Ihres RAM können Sie die MaxClients-Direktive berechnen. Denken Sie daran: "Ein Webserver sollte niemals tauschen müssen" ( Apache Performance Tuning )

Das Überwachen mit top oder htop ist in Ordnung, aber Sie benötigen eine bessere Übersicht über alle Statistiken Ihrer Server (CPU, RAM, Festplatten-E / A, Apache-Anforderungen, langsame MySQL-Abfragen usw.) mit einem Überwachungstool wie ganglia oder munin to mögliche Engpässe finden.

hdanniel
quelle
Im Moment habe ich nur die Befehle top und htop und kann ohnehin nicht alle Informationen verstehen. Dies ist die Aktivität, die gestern in der Hauptverkehrszeit stattgefunden hat. Sagen Sie mir bitte, wenn ich falsch liege: Aufgaben: 1043 insgesamt, 2 ausgeführt, 1041 schlafen, 0 gestoppt, 0 Zombie-CPU (s): 13,8% us, 1,8% sy, 0,0% ni, 82,1% id, 0,8% wa, 0,0% hallo, 1,5% Si, 0,0% st Mem: 4138360k insgesamt 3961276k verwendet, 177084k frei, 75016k Puffer tauschen: 2031608k insgesamt 1484k verwendet, 2030124k frei, 1836600k im Cache
andreszs
Ja, Ihr Server tauscht nicht aus. Ich bevorzuge reale Metriken, aber wenn Sie möchten, können Sie ein Stressing-Tool wie ab oder httperf verwenden, um zu überprüfen, wie viel Ihr Server verarbeiten kann. Kümmern Sie sich bei den Tests um MaxClients und beginnen Sie mit einer niedrigen Zahl (basierend auf der Annahme von 15 MB).
hdanniel
4

Ich empfehle, mit Apaches Benchmark-Tool (ab) herumzuspielen. Sie können mit den Werten herumspielen, um sie an Ihren Verkehrsfluss anzupassen, und sehen, welche Art von Antworten Sie bis zur durchschnittlichen Ladezeit und dergleichen erhalten. An diesem Punkt können Sie mit den Einstellungen, über die Sie sprechen, herumspielen, um sie zu optimieren. Sie sollten in der Lage sein, mit ab die optimale Leistung für jede Leistungsoptimierung in den Griff zu bekommen.

Es wäre nicht sehr klug von mir, über Ihre Einstellungen zu sprechen, aber Sie müssen auch Ihren RAM berücksichtigen, da es so aussieht, als würden Sie mit diesen Einstellungen viel RAM verbrauchen. Obwohl das nur Spekulation ohne Daten ist. htop gibt Ihnen einen guten Überblick über Ihre Ressourcen.

Auch Ihr Lastdurchschnitt könnte viel aussagen. Ich bezweifle, dass Ihre Auslastung viel höher ist als die Gesamtanzahl der Kerne zwischen 20 und 30% der CPU, aber es ist ein weiterer Indikator dafür, wie hart Ihr Server tatsächlich arbeitet.

Gans
quelle
Das Problem ist, dass ich nicht genug Erfahrung in der Serververwaltung habe, also fange an, mit Einstellungen herumzuspielen und die Ergebnisse zu überwachen. Ich habe das ab-Tool nie verwendet, um ehrlich zu sein. Um die Werte zu ändern, muss HTTDP neu gestartet werden. Dies bereitet meinen Benutzern Unannehmlichkeiten. Daher vermeide ich dies lieber. Stellen Sie sich vor, Sie senden eine Nachricht an einen anderen Benutzer und nachdem Sie auf "Senden" geklickt haben, wird ein Problem mit der Serververbindung angezeigt. Informationen zur CPU-Auslastung finden Sie in den Informationen aus meinem vorherigen Kommentar: In der Hauptverkehrszeit dürfen 15% nicht überschritten werden. Ich denke, das ist akzeptabel, wenn man bedenkt, dass ich gestern 6000 Online-Benutzer hatte.
Andreszs
Nun, ich würde definitiv nicht wollen, dass Sie dies in einer Produktionsumgebung tun. Ich empfehle dies zu Ihrer niedrigsten Traffic-Zeit, wenn ein anderer Server (mit sehr ähnlicher, wenn nicht identischer Hardware) getestet werden soll. ab ist ziemlich einfach zu bedienen, aber ich denke definitiv, dass toppledwagon eine gute Anleitung zur Berechnung Ihrer MaxClients gab. Sobald Sie aufhören, Swap Space zu verwenden, werden Sie eine deutliche Verbesserung feststellen. Überprüfen Sie httpd.apache.org/docs/2.0/programs/ab.html und cyberciti.biz/tips/… für AB
Gans