Beste sysctl.conf-Konfiguration für hohe Auslastung - extrem ausgelasteter Content-Streaming-Server

9

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
Daniel Johnson
quelle
Oh, ich habe vergessen zu erwähnen, als ich sagte, dass es nicht mehr reagiert, ich maen, es reagiert nicht mehr auf .php-Seiten, statische Seiten wie index.html und die Seite mit dem Serve-Status funktioniert einwandfrei ...
Daniel Johnson
2
Sie müssen zuerst herausfinden, was genau die Unempfindlichkeit verursacht . Es kann nichts damit zu tun haben sysctls. Überprüfen Sie, ob Prozesse ersticken, Speicher fehlt usw. straceund sehen Sie, warum / wo sie hängen.
Coredump
Sie hängen nicht ... wie gesagt, nur .php-Dateien werden tot. Server-Statusseite funktioniert gut ..
Daniel Johnson
1
@bilal müssen Sie überprüfen, wie alles zusammenarbeitet. Dies kann ein Sperrproblem sein, ein Problem mit gemeinsam genutzten Ressourcen (Speicher / IRQ). Es ist nicht trivial, eine Lösung für ein solches Problem zu finden.
Coredump
2
Können Sie hier weitere Informationen bereitstellen? netstat -in, ethtool -S eth0 (oder was auch immer Ihre Live-Schnittstelle ist). Was zeigt top, wenn Ihr Server langsamer wird (Speicherleitung)? Und - können Sie Details zur Serverhardware angeben? Marke / Typ, Typ der Netzwerkkarte, haben Sie andere Netzwerkkarten, die Sie verwenden könnten?
Nils

Antworten:

5

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:

ps auxgmww | grep php

Und wenn Sie sie zählen möchten, anstatt sie selbst zu zählen, können Sie Folgendes tun:

ps auxgmww | grep php | wc -l

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:

sysctl -a > sysctl.txt

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:

fs.file-nr = 3456   0   102295

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.

Neil Neely
quelle