Knowledge base

Kernelinstellingen voor veel open verbindingen

De sysctl-waarden en systemd-limieten die ertoe doen als een box tienduizenden sockets vasthoudt, en de waarden die van oude blogposts zijn gekopieerd en niets doen.

Eerst meten

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

ListenOverflows stijgen betekent dat de accept-queue vol zit en dat de kernel voltooide handshakes weggooit. Dat is een specifiek probleem met een specifieke oplossing. De meeste andere symptomen worden helemaal niet opgelost door sysctl, en het afstellen van een machine die niet onder druk staat verplaatst het uiteindelijke falen alleen maar naar een plek die moeilijker te vinden is.

De instellingen die hun plek 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

Wat elk van deze doet:

  • somaxconn begrenst de luister-backlog, en je applicatie moet er nog steeds om vragen. Bij nginx is dat listen ... backlog=65535; in de meeste talen is het het tweede argument van listen().
  • ip_local_port_range is aan de clientkant van belang. Een proxy die uitgaande verbindingen naar één bestemming opent, raakt binnen het standaardbereik na ongeveer achtentwintigduizend verbindingen door de tijdelijke poorten heen.
  • tcp_tw_reuse laat de kernel TIMEWAIT-sockets hergebruiken voor nieuwe uitgaande verbindingen. Veilig. Zijn neef `tcptw_recycle` werd in Linux 4.12 verwijderd, en elke gids die het nog steeds aanbeveelt, is vóór 2017 geschreven.
  • fq met bbr is een echte verbetering op lange of verliesrijke paden en een wassen neus op korte, schone paden. Beide zitten in de standaardkernels.

Connection tracking

Een stateful firewall geeft elke verbinding een conntrack-entry, en de tabel heeft een plafond. Het bereiken daarvan laat pakketten vallen en schrijft nf_conntrack: table full naar het kernellogboek.

sysctl net.netfilter.nf_conntrack_max net.netfilter.nf_conntrack_count

Verhoog het als je het geheugen hebt — elke entry kost enkele honderden bytes:

net.netfilter.nf_conntrack_max = 1048576

Waar de workload een stateless publieke dienst is, is het betere antwoord om het niet te volgen:

table inet raw {
  chain prerouting {
    type filter hook prerouting priority raw;
    tcp dport 443 notrack
  }
}

De limieten die systemd negeert

/etc/security/limits.conf geldt voor logins via PAM. Het heeft absoluut geen effect op een door systemd gestarte dienst. Daarom verandert het verhogen van nofile daar en het herstarten van nginx precies niets. Stel het in op de 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

Controleer dit tegen de draaiende dienst in plaats van tegen het bestand dat je net hebt geschreven:

systemctl show nginx -p LimitNOFILE

Drie dingen die je niet moet doen

  • Plak geen vijftigregelig sysctl-bestand van een forum. De helft ervan is gericht op een kernel die al tien jaar niet meer is uitgebracht, en één regel zal stilletjes de path MTU-discovery breken.
  • Verhoog tcp_rmem en tcp_wmem niet zonder een lang vet pad dat dit rechtvaardigt. Op een pad van één milliseconde leveren grotere buffers alleen latentie en geheugendruk op.
  • Schakel tcp_timestamps niet uit. Je verliest round-trip-schatting en PAWS en wint een gerucht over prestaties.

Meet na elke wijziging opnieuw, één wijziging per keer, en houd het bestand in versiebeheer zodat de volgende persoon kan zien wat je deed en waarom.

Klaar wanneer jij dat bent

Kies een stad. Kies een formaat. Betaal in munt.

Geen formulieren over wie je bent, geen wachten op een mens die je goedkeurt, geen telefoontje om iets te verifiëren. De factuur wordt betaald en de inloggegevens belanden in je inbox.