Ukur dahulu
ss -s
cat /proc/sys/fs/file-nr
nstat -az TcpExtListenOverflows TcpExtListenDropsListenOverflows yang naik berarti antrian penerimaan penuh dan kernel membuang jabat tangan yang selesai. Itu masalah spesifik dengan perbaikan spesifik. Sebagian besar gejala lain tidak diselesaikan oleh sysctl sama sekali, dan menyetel mesin yang tidak dalam tekanan hanya memindahkan kegagalan akhir ke tempat yang lebih sulit ditemukan.
Pengaturan yang layak dipakai
# /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_controlApa yang dilakukan masing-masing:
somaxconnmembatasi backlog listen, dan aplikasi Anda tetap harus memintanya. Di nginx itulisten ... backlog=65535; di kebanyakan bahasa itu argumen kedua untuklisten().ip_local_port_rangepenting di sisi klien. Proksi yang membuka koneksi keluar ke satu tujuan menghabiskan port ephemeral pada sekitar dua puluh delapan ribu dengan rentang default.tcp_tw_reusememungkinkan kernel menggunakan kembali soket TIMEWAIT untuk koneksi keluar baru. Aman. Sepupunya `tcptw_recycle` dihapus dari Linux pada 4.12, dan panduan mana pun yang masih merekomendasikannya ditulis sebelum 2017.fqdenganbbradalah peningkatan nyata pada jalur panjang atau lossy dan tidak berpengaruh pada jalur pendek yang bersih. Keduanya ada di kernel standar.
Connection tracking
Firewall stateful memberi setiap koneksi entri conntrack, dan tabel memiliki batas. Mencapainya menjatuhkan paket dan menulis nf_conntrack: table full ke log kernel.
sysctl net.netfilter.nf_conntrack_max net.netfilter.nf_conntrack_countNaikkan jika Anda memiliki memori — setiap entri memakan beberapa ratus byte:
net.netfilter.nf_conntrack_max = 1048576Jika beban kerja adalah layanan publik stateless, jawaban yang lebih baik adalah tidak melacaknya:
table inet raw {
chain prerouting {
type filter hook prerouting priority raw;
tcp dport 443 notrack
}
}Batas yang diabaikan systemd
/etc/security/limits.conf berlaku untuk login melalui PAM. Itu tidak berpengaruh sama sekali pada layanan yang dimulai oleh systemd, itulah sebabnya menaikkan nofile di sana dan me-restart nginx tidak mengubah apa pun. Atur pada 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 nginxVerifikasi terhadap layanan yang berjalan daripada file yang baru Anda tulis:
systemctl show nginx -p LimitNOFILETiga hal yang tidak boleh dilakukan
- Jangan menempel file sysctl lima puluh baris dari forum. Setengahnya menargetkan kernel yang tidak dirilis selama satu dekade, dan satu baris akan diam-diam merusak path MTU discovery.
- Jangan menaikkan
tcp_rmemdantcp_wmemtanpa jalur panjang gemuk untuk membenarkannya. Pada jalur satu milidetik, buffer yang lebih besar membeli latensi dan tekanan memori. - Jangan menonaktifkan
tcp_timestamps. Anda kehilangan estimasi round-trip dan PAWS, dan mendapatkan desas-desus tentang kinerja.
Ukur lagi setelah setiap perubahan, satu perubahan pada satu waktu, dan simpan file dalam kontrol versi sehingga orang berikutnya dapat melihat apa yang Anda lakukan dan mengapa.