Basis pengetahuan

Pengaturan kernel untuk banyak koneksi terbuka

Nilai sysctl dan batas systemd yang penting ketika sebuah kotak menampung puluhan ribu soket, dan yang disalin dari posting blog lama yang tidak melakukan apa-apa.

Ukur dahulu

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

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

Apa yang dilakukan masing-masing:

  • somaxconn membatasi backlog listen, dan aplikasi Anda tetap harus memintanya. Di nginx itu listen ... backlog=65535; di kebanyakan bahasa itu argumen kedua untuk listen().
  • ip_local_port_range penting 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_reuse memungkinkan 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.
  • fq dengan bbr adalah 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_count

Naikkan jika Anda memiliki memori — setiap entri memakan beberapa ratus byte:

net.netfilter.nf_conntrack_max = 1048576

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

Verifikasi terhadap layanan yang berjalan daripada file yang baru Anda tulis:

systemctl show nginx -p LimitNOFILE

Tiga 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_rmem dan tcp_wmem tanpa 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.

Siap saat Anda siap

Pilih kota. Pilih ukuran. Bayar dengan koin.

Tanpa formulir tentang siapa Anda, tanpa menunggu manusia untuk menyetujui, tanpa panggilan telepon untuk memverifikasi apa pun. Invoice dibersihkan dan kredensial masuk ke kotak masuk Anda.