Webserver und Cache-Server, bei hoher Parallelität wird die Grenze der maximalen Anzahl von Socket-Verbindungen angepasst:
1. Ändern Sie die Begrenzung der maximalen Anzahl von Dateien, die ein Benutzer verarbeiten kann.
Ab sofort gültig: ulimit-nxxx
Dauerhaft wirksam:
echo „ulimit-HSn65536“>>/etc/rc.local
echo „ulimit-HSn65536“>>/root/.bash_profile
ulimit-HSn65536
2. Ändern Sie das Netzwerk-Kernel-Limit für die maximale Anzahl von TCP-Verbindungen.
/etc/sysctl.conf
一、
Unabhängig davon, ob Sie auf der Linux-Plattform ein Client-Programm oder ein Serverprogramm schreiben, unterliegt die höchste Anzahl an Parallelitäten bei der Verarbeitung großer gleichzeitiger TCP-Verbindungen der Systembegrenzung hinsichtlich der Anzahl der Dateien, die ein Benutzer gleichzeitig öffnen kann Zeit in einem einzelnen Prozess (dies liegt daran, dass das System für jede TCP-Verbindung ein Socket-Handle erstellt und jedes Socket-Handle auch ein Dateihandle ist). Beispiel: Ein Redis-Programm, das nur einen Prozess startet, kann nur 1024 Dateien öffnen (Standard 1024) (1024 TCP-Verbindungen = 1024 Socket-Verbindungs-Handles = 1024 Datei-Handles),
Mit dem Befehl ulimit können Sie die Begrenzung der Anzahl der Dateien überprüfen, die das System dem aktuellen Benutzerprozess zum Öffnen erlaubt:
$ulimit-n
1024
Das bedeutet, dass jeder Prozess des aktuellen Benutzers bis zu 1024 Dateien gleichzeitig öffnen darf. Unter diesen 1024 Dateien sind dies die Standardeingabe, die Standardausgabe, der Standardfehler, der Server-Lausch-Socket und die Unix-Domäne für die Kommunikation zwischen Prozessen Jeder Prozess muss den Socket und andere Dateien öffnen, sodass nur noch etwa 1024-10=1014 Dateien für die Client-Socket-Verbindung verwendet werden können. Das heißt, Linux-basierte Kommunikationsprogramme erlauben standardmäßig bis zu 1014 gleichzeitige TCP-Verbindungen.
Für Kommunikationshandler, die eine höhere Anzahl gleichzeitiger TCP-Verbindungen unterstützen möchten, müssen Sie die Anzahl der Dateien ändern, die Linux gleichzeitig für den Prozess des aktuellen Benutzers geöffnet hat:
Soft-Limit (Softlimit): bezieht sich auf Linux, das die Anzahl der Dateien, die Benutzer gleichzeitig öffnen können, innerhalb des Bereichs, den das aktuelle System verträgt, weiter begrenzt
Harte Grenze: Die maximale Anzahl von Dateien, die gleichzeitig vom System geöffnet werden können, wird basierend auf den Hardwareressourcen des Systems (hauptsächlich Systemvideospeicher) geschätzt.
Im Allgemeinen ist das weiche Limit größer oder gleich dem harten Limit
Der einfachste Weg, die Begrenzung der maximalen Anzahl von Dateien, die von einem einzelnen Prozess geöffnet werden, zu ändern, ist die Verwendung des ulimit-Befehls:
[speng@as4~]$ulimit-n
Geben Sie im obigen Befehl die maximale Anzahl von Dateien an, die ein einzelner Prozess öffnen darf. Wenn das System etwas wie „Operationnotpermitted“ ausgibt, bedeutet dies, dass die obige Grenzwertänderung fehlgeschlagen ist. Tatsächlich liegt dies daran, dass der angegebene Wert das Soft-Limit oder Hard-Limit des Linux-Systems für die Anzahl der vom Benutzer geöffneten Dateien überschreitet. Daher ist es notwendig, die weichen und harten Grenzen des Linux-Systems für die Anzahl geöffneter Dateien für Benutzer zu ändern.
Der erste Schritt besteht darin, die Datei /etc/security/limits.conf zu ändern und der Datei die folgenden Zeilen hinzuzufügen:
spengsoftnofile10240
spenghardnofile10240
speng gibt den Grenzwert für die Anzahl der geöffneten Dateien an, die für diesen Benutzer geändert werden sollen. Das Zeichen „*“ kann verwendet werden, um die Änderung des Grenzwerts für alle Benutzer anzuzeigen
soft oder hard gibt an, ob das Soft-Limit oder das Hard-Limit geändert werden soll; 10240 gibt den neuen Grenzwert an, den Sie ändern möchten, d. h. die maximale Anzahl geöffneter Dateien (bitte beachten Sie, dass der Soft-Limit-Wert größer oder gleich sein muss). bis zur harten Grenze). Speichern Sie die Datei, nachdem Sie Änderungen vorgenommen haben.Der zweite Schritt besteht darin, die Datei /etc/pam.d/login zu ändern und der Datei die folgenden Zeilen hinzuzufügen:
sessionrequired/lib/security/pam_limits.so Dies teilt Linux mit, dass das Modul pam_limits.so aufgerufen werden sollte, nachdem der Benutzer die Systemanmeldung abgeschlossen hat, um die maximale Grenze des Systems für die Anzahl verschiedener Ressourcen festzulegen, die der Benutzer verwenden kann (einschließlich (maximale Anzahl an Ressourcen, die der Benutzer öffnen kann) Dateianzahlbegrenzung), und das Modul pam_limits.so liest die Konfiguration aus der Datei /etc/security/limits.conf, um diesen Grenzwert festzulegen. Speichern Sie diese Datei, nachdem Sie Änderungen vorgenommen haben.
Der dritte Schritt besteht darin, das Linux-Systemlimit für die maximale Anzahl geöffneter Dateien zu überprüfen. Verwenden Sie dazu den folgenden Befehl:
[speng@as4~]$cat/proc/sys/fs/file-max
12158
Dies zeigt, dass dieses Linux-System das gleichzeitige Öffnen von bis zu 12158 Dateien zulassen kann (d. h. einschließlich der Gesamtzahl der von allen Benutzern geöffneten Dateien), was eine harte Grenze auf Linux-Systemebene für alle Benutzer darstellt Die Begrenzung der Anzahl geöffneter Dateien sollte diesen Wert nicht überschreiten. Im Allgemeinen ist dieses harte Limit auf Systemebene das beste maximale Limit für die Anzahl der gleichzeitig geöffneten Dateien, basierend auf den Systemhardwareressourcen, wenn das Linux-System gestartet wird. Wenn kein besonderer Bedarf besteht, sollte dieses Limit nicht geändert werden Sie möchten die Anzahl der auf Benutzerebene geöffneten Dateien begrenzen. Legen Sie einen Wert fest, der diesen Grenzwert überschreitet.
Die Möglichkeit, dieses feste Limit zu ändern, besteht darin, das Skript /etc/rc.local zu ändern und die folgende Zeile zum Skript hinzuzufügen:
echo22158>/proc/sys/fs/file-max
Damit wird Linux gezwungen, die Anzahl der geöffneten Dateien auf Systemebene nach Abschluss des Startvorgangs auf 22158 zu beschränken. Speichern Sie diese Datei nach der Änderung.
Nachdem Sie die oben genannten Schritte ausgeführt haben, starten Sie das System neu. Unter normalen Umständen können Sie die maximale Anzahl von Dateien, die ein einzelner Prozess eines bestimmten Benutzers gleichzeitig öffnen darf, auf einen bestimmten Wert festlegen. Wenn Sie nach dem Neustart den Befehl ulimit-n verwenden, um zu überprüfen, ob die Begrenzung der Anzahl der Dateien, die ein Benutzer öffnen kann, immer höher ist als der in den obigen Schritten festgelegte Maximalwert, kann dies daran liegen, dass der Befehl ulimit-n im Das Benutzeranmeldeskript /etc/profile hat die Anzahl der Dateien, die der Benutzer gleichzeitig öffnen kann, bereits deaktiviert. Die Anzahl der Dateien ist begrenzt. Denn wenn Sie mit ulimit-n das Systemlimit für die maximale Anzahl von Dateien ändern, die ein Benutzer gleichzeitig öffnen kann, kann der neu geänderte Wert nur größer oder gleich dem zuvor mit ulimit-n festgelegten Wert sein , ist es nicht möglich, diesen Grenzwert mit diesem Befehl zu reduzieren.
Wenn also das obige Problem besteht, können Sie nur die Skriptdatei /etc/profile öffnen und in der Datei suchen, um zu sehen, ob ulimit-n verwendet wird, um die maximale Anzahl von Dateien zu begrenzen, die der Benutzer gleichzeitig öffnen kann. Wenn dieser gefunden wird, löschen Sie diesen Zeilenbefehl oder ändern Sie den eingestellten Wert auf einen geeigneten Wert, speichern Sie die Datei, und dann kann der Benutzer das System verlassen und sich erneut anmelden. Durch die oben genannten Schritte wird die Systembeschränkung für die Anzahl geöffneter Dateien für das Kommunikationsverarbeitungsprogramm aufgehoben, das die Verarbeitung von TCP-Verbindungen mit hoher Parallelität unterstützt.
2. Ändern Sie die Einschränkungen des Netzwerkkernels für TCP-Verbindungen
Wenn Sie einen Client-Kommunikationshandler unter Linux schreiben, der TCP-Verbindungen mit hoher Parallelität unterstützt, stellen Sie manchmal fest, dass das System zwar die Beschränkung für die Anzahl der Dateien, die Benutzer gleichzeitig öffnen können, aufgehoben hat, es jedoch immer noch Probleme gibt, wenn die Anzahl der Dateien sinkt Gleichzeitige TCP-Verbindungen sinken auf eine bestimmte Anzahl. Außerdem gelingt der erfolgreiche Aufbau einer neuen TCP-Verbindung. Es gibt viele Gründe für diese Vorkommnisse.
Der erste Grund könnte sein, dass der Linux-Netzwerkkernel Einschränkungen für den lokalen Portnummernbereich hat. Wenn Sie zu diesem Zeitpunkt weiter analysieren, warum die TCP-Verbindung nicht hergestellt werden kann, werden Sie feststellen, dass das Problem darin besteht, dass der connect()-Aufruf nicht zurückgegeben wird. Die Systemfehlermeldung lautet „Can'tassignrequestedaddress“. Wenn Sie zu diesem Zeitpunkt das Tool tcpdump verwenden, um das Netzwerk zu überwachen, wird festgestellt, dass während der TCP-Verbindung kein Netzwerkverkehr für den Client zum Senden von SYN-Paketen vorhanden ist. Diese Situation weist darauf hin, dass das Problem in Einschränkungen im lokalen Linux-Systemkernel liegt.
Obwohl die Hauptursache des Problems darin liegt, dass das TCP/IP-Vertragsimplementierungsmodul des Linux-Kernels den Bereich lokaler Portnummern begrenzt, die allen Client-TCP-Verbindungen im System entsprechen (z. B. begrenzt der Kernel den Bereich lokaler Ports). Zahlen bis 1024~32768 dazwischen). Wenn zu einem bestimmten Zeitpunkt zu viele TCP-Client-Verbindungen im System vorhanden sind, weil jede TCP-Client-Verbindung eine eindeutige lokale Portnummer belegt (diese Portnummer liegt innerhalb der lokalen Portnummernbereichsgrenze des Systems), wenn einige TCP-Client-Verbindungen vorhanden sind Alle lokalen Portnummern sind belegt und es ist schwierig, einer neuen TCP-Client-Verbindung eine lokale Portnummer zuzuweisen. Aus diesem Grund gibt das System in diesen Fällen einen Fehler zurück und setzt die Fehlermeldung auf „Can 'tassignrequestedaddress".
Für diese Steuerlogik können Sie den Linux-Kernel-Quellcode anzeigen. Am Beispiel des Linux2.6-Kernels können Sie die folgenden Funktionen in der Datei tcp_ipv4.c anzeigen:
staticinttcp_v4_hash_connect(structsock*sk)
Bitte beachten Sie die Zugriffskontrolle auf die Variable sysctl_local_port_range in der obigen Funktion. Die Initialisierung der Variablen sysctl_local_port_range wird in der folgenden Funktion in der tcp.c-Datei festgelegt:
void__inittcp_init(void)
Der beim Kompilieren des Kernels festgelegte standardmäßige lokale Portnummernbereich ist möglicherweise zu klein, daher muss diese Grenze für den lokalen Portbereich geändert werden.
Der erste Schritt besteht darin, die Datei /etc/sysctl.conf zu ändern, um das Linux-System-Image herunterzuladen und der Datei die folgenden Zeilen hinzuzufügen:
net.ipv4.ip_local_port_range=102465000
Dies zeigt an, dass die lokale Portbereichsgrenze des Systems auf 1024–65000 eingestellt ist. Bitte beachten Sie, dass der Mindestwert des lokalen Portbereichs kleiner oder gleich 1024 sein muss und der Höchstwert des Portbereichs größer oder gleich 65535 sein sollte. Speichern Sie diese Datei, nachdem Sie Änderungen vorgenommen haben.
Der zweite Schritt besteht darin, den sysctl-Befehl auszuführen:
[speng@as4~]$sysctl-p
Wenn im System keine Fehlermeldung angezeigt wird, bedeutet dies, dass der neue lokale Portbereich erfolgreich eingerichtet wurde. Bei Einstellung gemäß dem oben genannten Portbereich kann ein einzelner Prozess theoretisch mehr als 60.000 TCP-Client-Verbindungen gleichzeitig abschließen.
Der zweite Grund dafür, dass TCP-Verbindungen nicht abgeschlossen werden können, kann sein, dass die Firewall des Linux-Netzwerkkerns die maximale Anzahl verfolgter TCP-Verbindungen begrenzt. Zu diesem Zeitpunkt scheint das Programm beim Aufruf von connect () blockiert zu sein, genau wie beim Herunterfahren. Wenn Sie das Netzwerk mit dem Tool tcpdump überwachen, werden Sie auch feststellen, dass der Client keinen Netzwerkverkehr zum Senden von SYN hat Pakete während der TCP-Verbindung. Da die Firewall den Status jeder TCP-Verbindung im Kernel verfolgt, werden die Tracking-Informationen in der Conntrack-Datenbank im Kernel-Speicher abgelegt. Die Größe dieser Datenbank ist begrenzt, wenn zu viele TCP-Verbindungen im System vorhanden sind. Die Datenbankkapazität reicht nicht aus, IP_TABLE konnte keine Ablaufverfolgungsinformationen für die neue TCP-Verbindung erstellen, daher schien sie den connect()-Aufruf zu blockieren. An diesem Punkt müssen Sie das Kernel-Limit für die maximale Anzahl verfolgter TCP-Verbindungen ändern. Die Technik ähnelt der Änderung des Kernels-Limits für den lokalen Portnummernbereich:
Der erste Schritt besteht darin, die Datei /etc/sysctl.conf zu ändern und der Datei die folgenden Zeilen hinzuzufügen:
net.ipv4.ip_conntrack_max=10240
Dies weist darauf hin, dass das Systemlimit für die maximale Anzahl verfolgter TCP-Verbindungen auf 10240 eingestellt ist. Bitte beachten Sie, dass dieser Grenzwert so klein wie möglich sein sollte, um die Nutzung des Kernel-Speichers zu schonen.
Der zweite Schritt besteht darin, den sysctl-Befehl auszuführen:
[speng@as4~]$sysctl-p
Wenn im System keine Fehlermeldung angezeigt wird, bedeutet dies, dass das System den Grenzwert für die neue maximale Anzahl verfolgter TCP-Verbindungen erfolgreich geändert hat. Wenn die oben genannten Parameter festgelegt sind, kann ein einzelner Prozess theoretisch mehr als 10.000 TCP-Client-Verbindungen gleichzeitig abschließen.
Drei,
Wenn Sie Programmiertechnologie verwenden, die Netzwerk-E/A mit hoher Parallelität unterstützt, um TCP-Verbindungsanwendungen mit hoher Parallelität unter Linux zu kompilieren, müssen Sie geeignete Netzwerk-E/A-Technologie und I/O-Storm-Dispatching-Mechanismen verwenden. Zu den verfügbaren E/A-Technologien gehören synchrone E/A, nicht blockierende synchrone E/A (auch als reaktive E/A bezeichnet) und asynchrone E/A. Bei hoher TCP-Parallelität wird synchrone E/A verwendet. Dadurch wird der Betrieb des Programms erheblich blockiert, es sei denn, für die E/A jeder TCP-Verbindung wird ein Thread erstellt.
Allerdings verursachen zu viele Threads aufgrund der Thread-Planung des Systems enorme Kosten. Aus diesem Grund ist es nicht ratsam, synchrone E/A in Situationen mit hoher TCP-Parallelität zu verwenden. In diesem Fall können Sie die Verwendung nicht blockierender synchroner E/A oder asynchroner E/A-Techniken in Betracht ziehen unter Verwendung von select(), poll(), epoll und anderen Mechanismen. Die Technologie der asynchronen E/A besteht in der Verwendung von AIO. Aus Sicht des I/O-Storm-Dispatch-Mechanismus ist die Verwendung von select() ungeeignet, da es eine begrenzte Anzahl gleichzeitiger Verbindungen unterstützt (im Allgemeinen innerhalb von 1024). Unter Berücksichtigung der Leistung ist poll() ebenfalls ungeeignet (Limit-TCP-Verbindungsanzahlbegrenzung), obwohl es eine höhere Anzahl von TCP-Parallelität unterstützen kann und da es einen „Coroutine“-Mechanismus verwendet, wird es ausgeführt, wenn die Anzahl der Parallelität hoch ist Die Effizienz ist recht gering und es kann zu einer ungleichmäßigen Verteilung der E/A-Wellen kommen, was bei einigen TCP-Verbindungen zu einem „E/A-Ausfall“ führt. Wenn Sie epoll oder AIO verwenden, gibt es kein solches Problem (die anfängliche Implementierung der AIO-Technologie im Linux-Kernel wurde durch die Erstellung eines Threads für jede E/A-Anforderung im Kernel erreicht. Diese Implementierungsmechanismen werden im Fall von hoch- Es scheint auch ernsthafte Leistungsprobleme zu geben, aber im neuesten Linux-Kernel wurde die AIO-Implementierung schon lange verbessert.
Zusammenfassend lässt sich sagen, dass Sie bei der Entwicklung von Linux-Anwendungen, die TCP-Verbindungen mit hoher Parallelität unterstützen, versuchen sollten, Epoll- oder AIO-Technologie zu verwenden, um die E/A-Steuerung für gleichzeitige TCP-Verbindungen zu erreichen. Dadurch wird die Fähigkeit des Programms verbessert, TCP-Verbindungen mit hoher Parallelität zu verarbeiten. Der Support bietet effektive I/O-Garantien. Optimierung des Kernel-Parameters sysctl.conf
/etc/sysctl.conf ist eine Konfigurationsdatei, die zur Steuerung des Linux-Netzwerks verwendet wird. Sie ist sehr wichtig für Programme, die auf das Netzwerk angewiesen sind (z. B. Webserver und Cache-Server, die standardmäßig die besten Anpassungen bieten).
Empfohlene Konfiguration (löschen Sie den ursprünglichen Inhalt von /etc/sysctl.conf und kopieren Sie den folgenden Inhalt hinein):
cp/etc/sysctl.conf/etc/sysctl.conf.bak
echo"">/etc/sysctl.conf
vim/etc/sysctl.conf
net.ipv4.ip_local_port_range=102465535
net.core.rmem_max=16777216
net.core.wmem_max=16777216
net.ipv4.tcp_rmem=40968738016777216
net.ipv4.tcp_wmem=40966553616777216
net.ipv4.tcp_fin_timeout=10
net.ipv4.tcp_tw_recycle=1
net.ipv4.tcp_timestamps=0
net.ipv4.tcp_window_scaling=0
net.ipv4.tcp_sack=0
dev_max_backlog=30000
net.ipv4.tcp_no_metrics_save=1
net.core.somaxconn=10240
net.ipv4.tcp_syncookies=0
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
Diese Konfiguration bezieht sich auf die empfohlene Konfiguration des Cache-Server-Lacks und die empfohlene Konfiguration der SunOne-Serversystemoptimierung.
Die von Varnish empfohlene Konfiguration zeigt jedoch, dass die Konfiguration von „net.ipv4.tcp_fin_timeout=3“ häufig dazu führt, dass die Seite nach dem Besuch der Website nicht geöffnet werden kann Nach einem gewissen Zeitraum können alle Webseiten nicht geöffnet werden und funktionieren nach dem Neustart des Browsers normal. Es kann sein, dass die Internetgeschwindigkeit in den USA hoch ist. Bei 10 Sekunden ist alles normal (tatsächliche Betriebsableitung).
Nachdem die Änderungen abgeschlossen sind, führen Sie Folgendes aus:
sysctl-p/etc/sysctl.conf
sysctl-wnet.ipv4.route.flush=1
Der Befehl wird wirksam. Zur Sicherheit können Sie das System auch neu starten.
Passen Sie die maximale Anzahl offener Dateihandles an (maximale Anzahl von TCP-Verbindungen in einem einzelnen Prozess = maximale Anzahl von Socket-Verbindungen in einem einzelnen Prozess):
Nach der Optimierung des Netzwerks des Linux-Systems muss die Anzahl der vom System geöffneten Dateien erhöht werden, um eine große Parallelität zu unterstützen. Der Standardwert 1024 reicht bei weitem nicht aus.
Befehl ausführen:
Shell-Code
echo „ulimit-HSn65536“>>/etc/rc.local
echo „ulimit-HSn65536“>>/root/.bash_profile
ulimit-HSn65535
Das obige ist der detaillierte Inhalt vonSo passen Sie die maximale Anzahl von Socket-Verbindungslimits für Webserver und Cache-Server bei hoher Parallelität an. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!