cara memeriksa rx ring, max_backlog, dan ukuran max_syn_backlog

41

Cukup sering dalam penyelesaian masalah dan penyetelan hal-hal yang saya temukan tentang pengaturan kernel Linux berikut:

net.core.netdev_max_backlog
net.ipv4.tcp_max_syn_backlog
net.core.somaxconn

Selain fs.file-max, net.ipv4.ip_local_port_range, net.core.rmem_max, net.core.wmem_max, net.ipv4.tcp_rmem, dan net.ipv4.tcp_wmem, mereka tampaknya menjadi tombol-tombol penting untuk main-main dengan ketika Anda tuning kotak untuk tingkat tinggi concurrency.

Pertanyaan saya: Bagaimana saya bisa mengecek untuk melihat berapa banyak item dalam masing-masing antrian itu? Biasanya orang hanya mengaturnya sangat tinggi, tetapi saya ingin mencatat ukuran antrian itu untuk membantu memprediksi kegagalan di masa depan dan menangkap masalah sebelum mereka terlihat dengan cara yang terlihat oleh pengguna.

Colin Hostert
sumber
Ini pertanyaan yang luar biasa. Saya tertarik dengan masalah incast dan transmisi ulang beresolusi tinggi TCP.
dhchdhd

Jawaban:

29

Saya juga bertanya-tanya tentang hal ini dan termotivasi oleh pertanyaan Anda!

Saya telah mengumpulkan seberapa dekat saya bisa datang ke masing-masing antrian yang Anda daftarkan dengan beberapa informasi yang berkaitan dengan masing-masing. Saya menyambut komentar / umpan balik, setiap perbaikan pemantauan membuat segalanya lebih mudah untuk dikelola!

net.core.somaxconn

net.ipv4.tcp_max_syn_backlog

net.core.netdev_max_backlog

$ netstat -an | grep -c SYN_RECV 

Akan menunjukkan jumlah koneksi global saat ini dalam antrian, Anda dapat memecah ini per port dan menempatkan ini dalam pernyataan exec di snmpd.conf jika Anda ingin polling dari aplikasi pemantauan.

Dari:

netstat -s

Ini akan menunjukkan seberapa sering Anda melihat permintaan dari antrian:

146533724 packets directly received from backlog
TCPBacklogDrop: 1029
3805 packets collapsed in receive queue due to low socket buffer

fs.file-max

Dari:

http://linux.die.net/man/5/proc

$ cat /proc/sys/fs/file-nr
2720    0       197774

File ini (hanya baca) memberikan jumlah file yang saat ini dibuka. Ini berisi tiga angka: Jumlah pegangan file yang dialokasikan, jumlah pegangan file gratis dan jumlah maksimum menangani file.

net.ipv4.ip_local_port_range

Jika Anda dapat membuat daftar layanan pengecualian (netstat -an | grep LISTEN) maka Anda dapat menyimpulkan berapa banyak koneksi yang digunakan untuk aktivitas sesaat:

netstat -an | egrep -v "MYIP.(PORTS|IN|LISTEN)"  | wc -l

Harus juga memantau (dari SNMP):

TCP-MIB::tcpCurrEstab.0

Mungkin juga menarik untuk mengumpulkan statistik tentang semua negara yang terlihat di pohon ini (didirikan / time_wait / fin_wait / etc):

TCP-MIB::tcpConnState.*

net.core.rmem_max

net.core.wmem_max

Anda harus melakukan dtrace / strace sistem Anda untuk permintaan setockopt. Saya tidak berpikir statistik untuk permintaan ini dilacak sebaliknya. Ini sebenarnya bukan nilai yang berubah dari pemahaman saya. Aplikasi yang Anda gunakan mungkin akan meminta jumlah standar. Saya pikir Anda bisa 'membuat profil' aplikasi Anda dengan strace dan mengkonfigurasi nilai ini sesuai. (membahas?)

net.ipv4.tcp_rmem

net.ipv4.tcp_wmem

Untuk melacak seberapa dekat Anda dengan batas Anda harus melihat rata-rata dan maks dari bidang tx_queue dan rx_queue dari (secara teratur):

# cat /proc/net/tcp
  sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode                                                     
   0: 00000000:0FB1 00000000:0000 0A 00000000:00000000 00:00000000 00000000   500        0 262030037 1 ffff810759630d80 3000 0 0 2 -1                
   1: 00000000:A133 00000000:0000 0A 00000000:00000000 00:00000000 00000000   500        0 262029925 1 ffff81076d1958c0 3000 0 0 2 -1                

Untuk melacak kesalahan yang terkait dengan ini:

# netstat -s
    40 packets pruned from receive queue because of socket buffer overrun

Harus juga memantau kumpulan 'penyangga' global (melalui SNMP):

HOST-RESOURCES-MIB::hrStorageDescr.1 = STRING: Memory Buffers
HOST-RESOURCES-MIB::hrStorageSize.1 = INTEGER: 74172456
HOST-RESOURCES-MIB::hrStorageUsed.1 = INTEGER: 51629704
jumlahnya banyak
sumber
2

Saya pikir Anda mungkin bisa mendapatkan data itu dengan SystemTap. Berikut ini adalah referensi manual Redhat (pdf) . Ada juga panduan pemula (pdf) .

Alat ini terlihat cukup fleksibel untuk memungkinkan Anda mendapatkan data itu, khususnya probe::netdev.rxterlihat seperti sesuatu yang akan memberi Anda informasi tentang entri yang masuk, sekarang Anda "hanya" perlu menemukan ukuran bersih antrian dalam buffer, atau sesuatu yang menghitung hal-hal meninggalkan antrian ...

Paweł Brodacki
sumber