Ich bin kürzlich auf ein sehr interessantes Problem gestoßen. Es gibt eine Gruppe von HAProxys, die häufig Probleme haben. Melden Sie sich beim Server an und überprüfen Sie CPU, Speicher, Netzwerk und E/A. Schließlich wurde festgestellt, dass sich im TIME_WAIT-Zustand der Maschine mehr als 60.000 Verbindungen befanden. Der
TIME_WAIT-Status erscheint normalerweise auf Proxy-Maschinen wie HAProxy und Nginx, was hauptsächlich durch häufiges aktives Herunterfahren verursacht wird. Durch eine Änderung der Wiederverwendungs- und Recyclingparameter kann das Problem relativ schnell gelöst werden.
Die Statistik des Netzwerkstatus kann mit dem folgenden Befehl berechnet werden.
netstat -ant|awk '/^tcp/ {++S[$NF]} END {for(a in S) print (a,S[a])}' ESTABLISHED 70 FIN_WAIT2 30 CLOSING 33 TIME_WAIT 65520
Daran ist nichts Magisches, aber die Zahl 65535 ist wirklich zu empfindlich. Es hätte eine Art Obergrenze auslösen sollen.
Was uns noch mehr verwirrt, ist: Warum ist der Dienst nicht verfügbar, wenn die Verbindungen im TIME_WAIT-Zustand nur 65535 erreichen?
Sind die Behauptungen von Millionen von Verbindungen pro Maschine nur Prahlerei?
65535, was gleich 2 hoch 16 minus eins bedeutet, ist eine magische Zahl. Abgesehen von dieser kleinen Zahl wollen wir zunächst verstehen, wie viel Verbindungskapazität Linux unterstützt.
1. Wie viele Verbindungen kann Linux unterstützen?
Die Antwort ist zahllos. Aber es gibt nur 65535 Ports.
Warum gibt es nur 65535 Ports?
TCP- und UDP-Protokolle verwenden zu Beginn 16 Bit, um die Quell-Portnummer bzw. die Ziel-Portnummer zu speichern. Leider ist dieser Wert vom Typ short und die Größe beträgt ebenfalls 2^16-1.
Die aus historischen Gründen bedingten unveränderlichen Maßstäbe sind so tief verwurzelt.
Wie viele Verbindungen kann Linux also unterstützen? Die Antwort ist zahllos.
Nehmen Sie Nginx als Beispiel, wir überwachen es auf Port 80. Zu diesem Zeitpunkt stellt Maschine A eine Verbindung zu Nginx her und kann bis zu 60.000 lange Verbindungen initiieren. Wenn Maschine B eine Verbindung zu Nginx herstellt, kann sie auch 60.000 Mehrfachverbindungen initiieren. Dies liegt daran, dass die Bestimmung einer Verbindung durch src und dst bestimmt wird.
Die Vorstellung, dass Linux nur 65535 Verbindungen akzeptieren kann, kann nur als sehr oberflächliche Annahme bezeichnet werden.
65535 Ports, es könnte für Sie als Stresstester zu klein sein. Aber für Server ist es mehr als genug.
2. Wie kann man Millionen von Verbindungen unterstützen?
Wie Sie oben sehen können, gibt es keine Begrenzung für die Anzahl der Verbindungen. Aber Linux verfügt über eine weitere Schutzebene, nämlich die Anzahl der Dateihandles. Die Dinge, die über den Befehl lsof angezeigt werden, sind sogenannte Dateihandles.
Werfen wir zunächst einen Blick auf die Anzeige einiger Befehle.
ulmit zeigt die Anzahl der Dateihandles an, die jeder Prozess belegen kann.
ulimit -n 65535
file-max zeigt die Gesamtzahl der Dateihandles an, die das Betriebssystem für alle Prozesse belegen kann.
cat /proc/sys/fs/file-max 766722
file-nr, zeigt die Anzahl der aktuell verwendeten Handles und die Gesamtzahl der Handles an. Kann zur Überwachung verwendet werden.
cat /proc/sys/fs/file-nr 1824 0 766722
Um Millionen von Verbindungen zu unterstützen, müssen Handles auf Betriebssystemebene und Handles auf Prozessebene freigegeben werden. Mit anderen Worten, die Anzeige von ulimit und file-max muss größer als eine Million sein.
3. Wie stelle ich es ein?
Obwohl eine häufig verwendete Lösung darin besteht, die Anzahl der Prozesshandles nicht zu begrenzen, empfehle ich dringend, dies nicht zu tun. Aus keinem anderen Grund sind von der ulimit-Einstellung nur Prozesse betroffen, die in derselben Shell gestartet werden. Wenn Sie eine andere Shell öffnen oder die Maschine neu starten, verschwinden die ulimit-Änderungen. Dies ist die folgende Methode:
ulimit -n 1000000
Die richtige Methode besteht darin, die Datei /etc/security/limits.conf zu ändern. Zum Beispiel der folgende Inhalt.
root soft nofile 1000000 root hard nofile 1000000 * soft nofile 1000000 * hard nofile 1000000
Sie sehen, dass wir die Anzahl der Handles für einen bestimmten Benutzer ändern können. Dies tritt häufig bei der Installation von Anwendungen wie es auf.
es - nofile 65535
Bei dieser Methode müssen Sie zum Betrieb noch eine neue Shell öffnen. Dieser Befehl wird weder in der geänderten Shell noch in der Shell vor der Änderung wirksam. xjjdog ist auf mehrere Fälle gestoßen, in denen trotz der Aufhebung der Beschränkungen immer noch Probleme auftraten.
Sehen Sie sich die Speicherzuordnungsdatei des Prozesses an, um festzustellen, ob diese Änderungen wirksam wurden. Beispielsweise werden im Befehl „cat /proc/180323/limits“ detaillierte Informationen angezeigt.
Dieser Wert ist nicht so hoch eingestellt, wie Sie möchten. Seine obere Größengrenze wird durch nr_open bestimmt. Um die Größe zu erhöhen, ändern Sie den Wert von fs.nr_open in /ect/sysct.conf.
cat /proc/sys/fs/nr_open 1048576
Wenn Sie den Parameter „file-max“ ändern möchten, wird empfohlen, den folgenden Inhalt zur Datei /etc/sysctl.conf hinzuzufügen. Es sind mehr als 6 Millionen!
fs.file-max = 6553560
Wenn die Anzahl der Dateien überschritten wird, wird der Fehler Kernel: VFS: Datei-Maximalgrenze 65535 erreicht gemeldet.
Um es zusammenzufassen.
Selbst wenn Linux einen Port öffnet, kann es eine enorme Anzahl von Verbindungen akzeptieren. Die Obergrenze dieser Verbindungen ist durch die Anzahl der Dateihandles in einem einzelnen Prozess und die Anzahl der Dateihandles im Betriebssystem begrenzt, d. h. ulimit und file-max.
Um Parameteränderungen dauerhaft zu speichern, neigen wir dazu, die Änderungen in Dateien zu schreiben. Das Datei-Handle-Limit des Prozesses kann in /etc/security/limits.conf platziert werden, und seine Obergrenze wird durch fs.nr_open begrenzt. Das Datei-Handle-Limit des Betriebssystems kann in /etc/sysctl.conf platziert werden Datei. Überprüfen Sie abschließend unbedingt die Datei /proc/$id/limits, um zu bestätigen, ob die Änderung im Prozess wirksam geworden ist.
Das obige ist der detaillierte Inhalt vonSo beheben Sie Ulimit-Fehler. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!