Apakah tcp-backlog seukuran "antrian koneksi lengkap" (jabat tangan tiga arah selesai, apa yang dijelaskan di sini) atau "antrean koneksi tidak lengkap"?
tcp-backlog
adalah ukuran antrean koneksi lengkap . Faktanya, Redis meneruskan konfigurasi ini sebagai parameter kedua dari listen(int s, int backlog)
telepon.
@GuangshengZuo sudah memiliki jawaban yang bagus untuk pertanyaan ini. Jadi saya akan fokus pada yang lain.
Jika itu berarti "antrean koneksi lengkap" lalu mengapa saya harus menaikkan tcp_max_syn_backlog yang membatasi ukuran antrian koneksi yang tidak lengkap?
Kutipan dari dokumen yang Anda sebutkan:
Implementasinya menggunakan dua antrian, antrian SYN (atau antrian koneksi tidak lengkap) dan antrian penerimaan (atau antrian koneksi lengkap). Koneksi dalam status SYN RECEIVED ditambahkan ke antrian SYN dan kemudian dipindahkan ke antrian terima ketika statusnya berubah menjadi ESTABLISHED, yaitu ketika paket ACK dalam jabat tangan 3 arah diterima. Sesuai dengan namanya, panggilan terima kemudian diimplementasikan hanya untuk menggunakan koneksi dari antrian terima. Dalam hal ini, argumen backlog dari syscall mendengarkan menentukan ukuran antrian terima.
Kita dapat melihat bahwa item dalam complete connection queue
dipindahkan dari incomplete connection queue
.
Jika Anda memiliki somaxconn
besar dengan tcp_max_syn_backlog
kecil , maka Anda mungkin TIDAK memiliki cukup item untuk dipindahkan ke complete connection queue
, dan complete connection queue
mungkin tidak akan pernah penuh. Banyak permintaan mungkin telah dibatalkan dari antrean pertama sebelum sempat dipindahkan ke antrean kedua.
Jadi hanya menaikkan nilai somaxconn
mungkin TIDAK bekerja. Anda harus membesarkan keduanya.