Bagaimana saya bisa memonitor panjang antrian penerimaan?

9

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?

Phil Frost
sumber
Anda sedang mencari netstat.
Satō Katsura
Sejauh yang saya tahu, netstathanya menunjukkan panjang antrian kirim dan terima, yang tidak sama dengan antrian accept.
Phil Frost
Ya, itu tidak ditampilkan secara default. man netstat | less +/Flags
Satō Katsura
Saya tidak yakin bagaimana flag-flag itu memberi tahu saya panjang antrian yang diterima - sebenarnya netstattampaknya tidak muncul Flagssama sekali untuk koneksi TCP. Dari sedikit pengujian, sepertinya koneksi ditampilkan sebagai ESTABLISHEDdi netstat, bahkan jika saya mencoba membuka koneksi ke sebuah proses yang tidak listen()tetapi tidak pernah accept().
Phil Frost
Benar, melihat sumber-sumber tampaknya bendera-bendera itu untuk soket UNIX. Untuk TCP Anda bisa menghitung saja 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 untuk accept()melakukan tugasnya, Anda menunggu untuk ACKtiba dari penghubung penghubung untuk menyelesaikan koneksi.
Satō Katsura

Jawaban:

3

Untuk memeriksa apakah antrian Anda meluap, gunakan netstat atau nstat

[centos ~]$ nstat -az | grep -i listen
TcpExtListenOverflows           3518352            0.0
TcpExtListenDrops               3518388            0.0
TcpExtTCPFastOpenListenOverflow 0  0.0

[centos ~]$ netstat -s | grep -i LISTEN
    3518352 times the listen queue of a socket overflowed
    3518388 SYNs to LISTEN sockets dropped

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.

$ ss -n state syn-recv sport = :80 | wc -l
119

Referensi: https://blog.cloudflare.com/syn-packet-handling-in-the-wild/

lfmunoz
sumber
2

Sysdig akan memberikan beberapa informasi ini di akhir setiap acceptsyscall, sebagai queuelenargumen. Ini juga menunjukkan panjang antrian sebagai queuemax.

7598971 21:05:30.322229280 1 gunicorn (6451) < accept fd=13(<4t>127.0.0.1:45882->127.0.0.1:8003) tuple=127.0.0.1:45882->127.0.0.1:8003 queuepct=0 queuelen=0 queuemax=10

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 collectdatau serupa.

Phil Frost
sumber
0

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".

mkzia
sumber
Walaupun tampaknya ada beberapa informasi berguna di sini, saya tidak yakin itu menjawab pertanyaan. Jika saya bertanya, "Berapa banyak orang yang pernah berada di auditorium ini pada satu waktu?", Dan Anda menunjuk pada tanda di dinding yang memberikan kapasitas maksimum, Anda belum menjawab pertanyaan.
Scott
Memang saya mencari panjang antrian saat ini, bukan panjang maksimum antrian.
Phil Frost
3
Seharusnya tcp_max_syn_backlog, bukan tcp_max_SYNC_backlog seperti dalam jawaban Anda
DevilaN
Ya ... dan StackOverflow memberi Anda pesan kesalahan terbelakang ketika Anda mencoba mengubahnya: "Pengeditan minimal harus 6 karakter; apakah ada hal lain yang harus diperbaiki dalam posting ini?"
Aaron C. de Bruyn