Maafkan saya jika ini bukan forum terbaik untuk pertanyaan ini, tetapi tampaknya lebih relevan untuk kernel daripada pemrograman itu sendiri.
Saya sedang menulis skrip yang menanyakan sistem untuk port terbuka sehingga kami dapat membuat grafik dan memantau statistik. Untuk ini, saya menggunakan perintah "ss" dari paket iproute. Jika Anda mengeksekusi ss -s|grep estab
Anda akan menerima output yang mirip dengan ini:
TCP: 296 (estab 6, closed 238, orphaned 0, synrecv 0, timewait 238/0), ports 0
Pertanyaan saya berkaitan dengan variabel timewait, yang menunjukkan soket yang dihitung dalam keadaan TIME_WAIT. Ketika saya mencoba mencari tahu nomor apa yang dirujuk setelah slash, itu menjadi petualangan angin puyuh untuk mencari kode sumber yang akhirnya membuat saya menemukan potongan berikut:
printf("TCP: %d (estab %d, closed %d, orphaned %d, synrecv %d, timewait %d/%d), ports %d\n",
s.tcp_total + slabstat.tcp_syns + s.tcp_tws,
sn.tcp_estab,
s.tcp_total - (s.tcp4_hashed+s.tcp6_hashed-s.tcp_tws),
s.tcp_orphans,
slabstat.tcp_syns,
s.tcp_tws, slabstat.tcp_tws,
slabstat.tcp_ports
);
Harus saya akui, pencarian saya akan arti "slabstat" pada akhirnya mengarah pada pembelajaran saya tentang cache slab dan antarmuka pelaporannya di / proc / slabinfo.
Pertanyaannya: Apa hubungan slabtable dengan perhitungan soket TIME_WAIT? Saya gagal mengetahui mengapa nomor ini dilaporkan, karena setiap kali saya menjalankan perintah di setiap server yang saya coba, jumlahnya selalu nol.
sumber
Jawaban:
Sepertinya
tcp_tw_buckets
inilah yang akhirnya disurvei, yang merupakan struct dihapus dari Linux 2.6.12Jadi angka terakhir mungkin selalu 0 kecuali pada kernel 7 tahun.
Adapun query slab, sejauh yang saya tahu itu sangat cepat lebih cepat daripada metode lain yang tersedia.
sumber