Erst messen
ss -s
cat /proc/sys/fs/file-nr
nstat -az TcpExtListenOverflows TcpExtListenDropsListenOverflows steigend bedeutet, dass die Accept-Queue voll ist und der Kernel abgeschlossene Handshakes verwirft. Das ist ein konkretes Problem mit einer konkreten Lösung. Die meisten anderen Symptome werden durch sysctl gar nicht behoben, und das Tuning einer Maschine, die nicht unter Last steht, verschiebt den eventuellen Ausfall nur an eine Stelle, die schwerer zu finden ist.
Die Einstellungen, die ihren Platz verdienen
# /etc/sysctl.d/90-connections.conf
fs.file-max = 2097152
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 32768
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.ip_local_port_range = 10240 65535
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_slow_start_after_idle = 0
net.ipv4.tcp_mtu_probing = 1
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbrsysctl --system
sysctl net.ipv4.tcp_congestion_controlWas jede einzelne bewirkt:
somaxconnbegrenzt die Listen-Backlog, und Ihre Anwendung muss sie trotzdem anfordern. Bei nginx ist daslisten ... backlog=65535; in den meisten Sprachen ist es das zweite Argument fürlisten().ip_local_port_rangeist auf der Client-Seite wichtig. Ein Proxy, der ausgehende Verbindungen zu einem Ziel öffnet, erschöpft die ephemeren Ports bei ungefähr achtundzwanzigtausend mit dem Standardbereich.tcp_tw_reuselässt den Kernel TIMEWAIT-Sockets für neue ausgehende Verbindungen wiederverwenden. Sicher. Sein Cousin `tcptw_recycle` wurde in Linux 4.12 entfernt, und jede Anleitung, die ihn immer noch empfiehlt, wurde vor 2017 geschrieben.fqmitbbrist eine echte Verbesserung auf langen oder verlustbehafteten Pfaden und ein Nullsummenspiel auf kurzen, sauberen. Beide sind in den Standard-Kerneln enthalten.
Connection Tracking
Eine zustandsbehaftete Firewall gibt jeder Verbindung einen conntrack-Eintrag, und die Tabelle hat eine Obergrenze. Wenn sie erreicht wird, werden Pakete verworfen und nf_conntrack: table full in das Kernel-Log geschrieben.
sysctl net.netfilter.nf_conntrack_max net.netfilter.nf_conntrack_countErhöhen Sie sie, wenn Sie den Speicher haben – jeder Eintrag kostet ein paar hundert Bytes:
net.netfilter.nf_conntrack_max = 1048576Wo die Arbeitslast ein zustandsloser öffentlicher Dienst ist, ist die bessere Antwort, sie nicht zu tracken:
table inet raw {
chain prerouting {
type filter hook prerouting priority raw;
tcp dport 443 notrack
}
}Die Limits, die systemd ignoriert
/etc/security/limits.conf gilt für Logins über PAM. Es hat keinerlei Wirkung auf einen Dienst, der von systemd gestartet wird. Deshalb ändert das Erhöhen von nofile dort und der Neustart von nginx genau nichts. Setzen Sie es an der Unit:
mkdir -p /etc/systemd/system/nginx.service.d
cat > /etc/systemd/system/nginx.service.d/limits.conf <<EOF
[Service]
LimitNOFILE=1048576
EOF
systemctl daemon-reload
systemctl restart nginxPrüfen Sie gegen den laufenden Dienst und nicht gegen die Datei, die Sie gerade geschrieben haben:
systemctl show nginx -p LimitNOFILEDrei Dinge, die man nicht tun sollte
- Keine fünfzigzeilige sysctl-Datei aus einem Forum einfügen. Die Hälfte zielt auf einen Kernel, der seit einem Jahrzehnt nicht mehr ausgeliefert wurde, und eine Zeile wird leise die Path-MTU-Discovery brechen.
tcp_rmemundtcp_wmemnicht erhöhen ohne einen langen, dicken Pfad, der es rechtfertigt. Auf einem Pfad mit einer Millisekunde kaufen größere Puffer Latenz und Speicherdruck.tcp_timestampsnicht deaktivieren. Sie verlieren die Round-Trip-Schätzung und PAWS und gewinnen ein Gerücht über Leistung.
Messen Sie nach jeder Änderung erneut, eine Änderung nach der anderen, und halten Sie die Datei unter Versionskontrolle, damit die nächste Person sehen kann, was Sie getan haben und warum.