Saya memiliki hipotesis: kadang-kadang koneksi TCP tiba lebih cepat daripada server saya accept()
. Mereka mengantri sampai antrian meluap dan kemudian ada masalah.
Bagaimana saya bisa mengkonfirmasi ini terjadi?
Dapatkah saya memonitor panjang antrian penerimaan atau jumlah luapan? Apakah ada penghitung yang terbuka di suatu tempat?
linux
networking
monitoring
Phil Frost
sumber
sumber
netstat
.netstat
hanya menunjukkan panjang antrian kirim dan terima, yang tidak sama dengan antrian accept.man netstat | less +/Flags
netstat
tampaknya tidak munculFlags
sama sekali untuk koneksi TCP. Dari sedikit pengujian, sepertinya koneksi ditampilkan sebagaiESTABLISHED
dinetstat
, bahkan jika saya mencoba membuka koneksi ke sebuah proses yang tidaklisten()
tetapi tidak pernahaccept()
.SYN_RECV
. Tidak ada antrian lain selain itu. Saya kira kernel bisa dikatakan entah bagaimana untuk login paket yang jatuh karena terlalu banyak koneksi setengah terbuka, tetapi sudah ada 10+ tahun sejak saya melihat jaringan dengan Linux, jadi saya tidak tahu bagaimana melakukan itu. Di samping catatan: Anda tidak menunggu untukaccept()
melakukan tugasnya, Anda menunggu untukACK
tiba dari penghubung penghubung untuk menyelesaikan koneksi.Jawaban:
Untuk memeriksa apakah antrian Anda meluap, gunakan netstat atau nstat
Referensi: https://perfchron.com/2015/12/26/investigating-linux-network-issues-with-netstat-and-nstat/
Untuk memantau ukuran antrian Anda, gunakan perintah ss dan cari soket SYN-RECV.
Referensi: https://blog.cloudflare.com/syn-packet-handling-in-the-wild/
sumber
Sysdig akan memberikan beberapa informasi ini di akhir setiap
accept
syscall, sebagaiqueuelen
argumen. Ini juga menunjukkan panjang antrian sebagaiqueuemax
.Sejauh yang saya ketahui, tidak ada mekanisme untuk mengetahui secara pasti kapan atau berapa kali antrian telah meluap. Dan akan sulit untuk mengintegrasikan ini dengan pemantauan berkala oleh
collectd
atau serupa.sumber
Apa yang Anda cari adalah entri dalam output dari perintah sysctl -a seperti :::
net.ipv4.tcp_max_sync_backlog = 4096
Dalam contoh kasus di atas, jaminan simpanan koneksi negara SYN maksimum 4096. Anda dapat meningkatkannya berdasarkan berapa banyak RAM di server Anda. Saya menganggap 32K backlog sebagai awal yang baik untuk pencarian server web yang sarat muatan.
Juga pastikan bahwa berikut ini TIDAK diatur ke Satu (1) ::
net.ipv4.tcp_abort_on_overflow = 0
Kalau tidak pasti akan menjatuhkan paket jika ada backlog overflow.
Anda dapat dengan mudah memeriksa melalui
"sysctl -a | backgr egrep"
"sysctl -a | egrep overflow"
Selain itu, Anda dapat menemukan label "terjatuh" di bawah
"ifconfig -a"
output perintah. Itu menunjukkan berapa banyak paket yang dijatuhkan untuk setiap antarmuka bersama dengan data dan kesalahan lainnya dll.
Untuk Logging paket yang dijatuhkan ada artikel paywall di RHEL 7 ::
https://access.redhat.com/solutions/1191593
Untuk penelitian lebih lanjut, Anda dapat membaca:
http://veithen.io/2014/01/01/how-tcp-backlog-works-in-linux.html
Ini menyatakan di sini sesuai Steven Book Illustrated TCP / IP:
"Batas antrian berlaku untuk jumlah [...] jumlah entri pada antrian koneksi tidak lengkap [...] dan [...] jumlah entri pada antrian koneksi yang selesai [...]."
Karenanya juga menyatakan bahwa:
"Antrian koneksi selesai hampir selalu kosong karena ketika entri ditempatkan pada antrian ini, panggilan server untuk menerima kembali, dan server mengambil koneksi selesai dari antrian."
Antrian accept mungkin karenanya tampak benar-benar kosong dan Anda harus menyetel (mungkin dalam hal ini) server Web Apache Anda untuk menerima lebih cepat koneksi yang ditempatkan pada antrian "total agregat".
sumber