Wissensdatenbank

Kernel-Einstellungen für viele offene Verbindungen

Die sysctl-Werte und systemd-Limits, die wichtig sind, wenn eine Box Zehntausende Sockets hält, und diejenigen, die aus alten Blogposts kopiert wurden und nichts bewirken.

Erst messen

ss -s
cat /proc/sys/fs/file-nr
nstat -az TcpExtListenOverflows TcpExtListenDrops

ListenOverflows 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 = bbr
sysctl --system
sysctl net.ipv4.tcp_congestion_control

Was jede einzelne bewirkt:

  • somaxconn begrenzt die Listen-Backlog, und Ihre Anwendung muss sie trotzdem anfordern. Bei nginx ist das listen ... backlog=65535; in den meisten Sprachen ist es das zweite Argument für listen().
  • ip_local_port_range ist 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_reuse lä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.
  • fq mit bbr ist 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_count

Erhöhen Sie sie, wenn Sie den Speicher haben – jeder Eintrag kostet ein paar hundert Bytes:

net.netfilter.nf_conntrack_max = 1048576

Wo 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 nginx

Prüfen Sie gegen den laufenden Dienst und nicht gegen die Datei, die Sie gerade geschrieben haben:

systemctl show nginx -p LimitNOFILE

Drei 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_rmem und tcp_wmem nicht erhöhen ohne einen langen, dicken Pfad, der es rechtfertigt. Auf einem Pfad mit einer Millisekunde kaufen größere Puffer Latenz und Speicherdruck.
  • tcp_timestamps nicht 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.

Bereit, wenn Sie es sind

Wählen Sie eine Stadt. Wählen Sie eine Größe. Bezahlen Sie in Coins.

Keine Formulare darüber, wer Sie sind, kein Warten auf einen Menschen, der Sie genehmigt, kein Anruf zur Verifizierung. Die Rechnung wird beglichen, und die Zugangsdaten landen in Ihrem Posteingang.