Eerst meten
ss -s
cat /proc/sys/fs/file-nr
nstat -az TcpExtListenOverflows TcpExtListenDropsListenOverflows 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 = bbrsysctl --system
sysctl net.ipv4.tcp_congestion_controlWat elk van deze doet:
somaxconnbegrenst de luister-backlog, en je applicatie moet er nog steeds om vragen. Bij nginx is datlisten ... backlog=65535; in de meeste talen is het het tweede argument vanlisten().ip_local_port_rangeis 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_reuselaat 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.fqmetbbris 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_countVerhoog het als je het geheugen hebt — elke entry kost enkele honderden bytes:
net.netfilter.nf_conntrack_max = 1048576Waar 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 nginxControleer dit tegen de draaiende dienst in plaats van tegen het bestand dat je net hebt geschreven:
systemctl show nginx -p LimitNOFILEDrie 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_rmementcp_wmemniet zonder een lang vet pad dat dit rechtvaardigt. Op een pad van één milliseconde leveren grotere buffers alleen latentie en geheugendruk op. - Schakel
tcp_timestampsniet 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.