Was ist die beste sysctl.conf-Konfiguration für einen stark ausgelasteten Content-Streaming-Server mit hoher Auslastung? Der Server ruft den Inhalt von Remote-Servern wie Amazon, S3 usw. ab und verwendet dann PHP, um den Inhalt dynamisch an den Benutzer zu streamen, ohne ihn auf der Festplatte zu speichern. PHP verwendet CURL, um die Datei abzurufen, und verwendet dann Flush (), um sie gleichzeitig zu streamen, sodass nicht viel Festplattenarbeit geleistet wird ... nur Netzwerk und Bandbreite.
Der Server ist ein Quad-Core-XEON mit einer 1-Gbit-Vollduplex-Netzwerkkarte, 8 GB RAM und 500 GB x 2 RAID. Die Auslastung des Serverspeichers und die CPU-Auslastung sind ziemlich gering.
Wir führen Debian Lenny und Lighttpd2 darauf (ja, ich weiß, es ist noch nicht veröffentlicht :-)) mit PHP 5.3.6 und PHP Fastcgi mit Spawn-Fcgi-Bindung an 4 verschiedenen Unix-Sockets mit jeweils 20 Kindern. Die maximale Anzahl an fcgi-Anforderungen beträgt 20, wobei sich das Modul mod_balancer in der lighttpd2-Konfiguration befindet, um die fastcgi-Anforderungen auf diese 4 Sockets in der SQF-Konfiguration (Short Queue First) zu verteilen.
Unsere Server verbrauchen viel Bandbreite, dh die Netzwerkverbindung ist ständig besetzt. Unmittelbar nach 100 bis 200 parallelen Verbindungen verlangsamt sich der Server und reagiert schließlich nicht mehr. Es treten Fehler beim Verbindungs-Timeout auf. Wenn wir cpanel hatten, haben wir nie Timeout-Fehler erhalten, daher kann es sich nicht um ein Skriptproblem handeln. Es muss sich um ein Netzwerkkonfigurationsproblem handeln.
lighttpd2-Konfiguration: Worker-Prozesse = 8, Keep-Alive-Anforderungen sind 32, Keep-Alive-Zeitlimit beträgt 10 Sekunden und maximale Verbindungen sind 8192.
Unsere aktuellen Inhalte auf sysctl.conf sind:
net.ipv4.tcp_fin_timeout = 1
net.ipv4.tcp_tw_recycle = 1
# Increase maximum amount of memory allocated to shm
kernel.shmmax = 1073741824
# This will increase the amount of memory available for socket input/output queues
net.ipv4.tcp_rmem = 4096 25165824 25165824
net.core.rmem_max = 25165824
net.core.rmem_default = 25165824
net.ipv4.tcp_wmem = 4096 65536 25165824
net.core.wmem_max = 25165824
net.core.wmem_default = 65536
net.core.optmem_max = 25165824
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_orphans = 262144
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2
# you shouldn't be using conntrack on a heavily loaded server anyway, but these are
# suitably high for our uses, insuring that if conntrack gets turned on, the box doesn't die
# net.ipv4.netfilter.ip_conntrack_max = 1048576
# net.nf_conntrack_max = 1048576
# For Large File Hosting Servers
net.core.wmem_max = 1048576
net.ipv4.tcp_wmem = 4096 87380 524288
quelle
sysctls
. Überprüfen Sie, ob Prozesse ersticken, Speicher fehlt usw.strace
und sehen Sie, warum / wo sie hängen.Antworten:
Leistungsoptimierung und Identifizierung solcher Engpässe sind ein schwer zu lösendes Problem und erfordern häufig viele Informationen zur Diagnose. Der Schlüssel zum Prozess besteht darin, den verwendeten Prozess zu durchlaufen und zu prüfen, ob Sie feststellen können, welche Ressource erschöpft ist. Wenn Sie sagten, der Server reagiert nicht auf PHP, aber HTML dient immer noch, das ist ein interessanter Datenpunkt. Was ist anders daran, wie diese serviert werden? Es kann sich um subtile Netzwerkpufferüberschreitungen handeln, oder es kann grundlegender sein. Möglicherweise haben Sie einfach das Limit von 20 untergeordneten fcgi-untergeordneten Prozessen ausgeschöpft, und alle sind damit beschäftigt, Daten bereitzustellen, während neue Anforderungen in die Abhörwarteschlange eingeklemmt werden (und schließlich eine Zeitüberschreitung auftreten) und darauf warten, dass ein fcgi-PHP-Prozess ausgeführt wird.
Der eigentliche Trick beim Versuch, die Sichtbarkeit der Box zu verbessern, besteht darin, sich bei auftretenden Problemen bei der Box anzumelden und Informationen zu sammeln.
Um herauszufinden, wie viele PHP-Prozesse ausgeführt werden, sollten Sie in der Lage sein, Folgendes auszuführen:
Und wenn Sie sie zählen möchten, anstatt sie selbst zu zählen, können Sie Folgendes tun:
Zurück zu Ihrer ursprünglichen Frage zur Leistungsoptimierung: Bevor Sie syctl.conf ändern, möchten Sie möglicherweise sehen, was Ihr Server Ihnen sagt, wenn das Problem auftritt. Sie können dies wie folgt herausfinden:
Zeigen Sie dann Ihre Textdatei an - es handelt sich um eine ganze Reihe von Daten. Bevor Sie jedoch einen bestimmten Wert optimieren, prüfen Sie, ob die sysctl-Ausgabe Informationen darüber enthält, was derzeit für diese einstellbare Datei verwendet wird und was sie möglicherweise verbraucht. Ein Beispiel sind offene Dateien, für die Sie hier eine Beispielausgabe sehen können:
Das sagt uns, dass wir 3456 Dateideskriptoren verwenden, aber unser Limit ist 102295, also sind wir bei weitem nicht in der Nähe unseres Limits. Wenn die erste Zahl im Bereich von 100000 gelegen hätte, würde dies Ihnen sagen, dass Ihnen die Dateideskriptoren ausgehen und dass Sie diese einstellen müssen.
quelle