Mendapatkan jumlah koneksi TCP saat ini pada suatu sistem

22

Alih-alih melakukan wc -l /proc/net/tcp, apakah ada cara yang lebih cepat untuk melakukannya?

Saya hanya perlu jumlah total koneksi tcp.

bunga aster
sumber
5
Mungkin mencobass -s
Ulrich Dangel
@UlrichDangel keren, itu lebih cepat, dengan membaca sockstat; Anda dapat benar-benar meletakkannya di area jawaban ;-)
daisy

Jawaban:

20

Jika Anda hanya ingin mendapatkan nomornya dan tidak memerlukan detail, Anda dapat membaca datanya /proc/net/sockstat{,6}. Perlu diingat bahwa Anda harus menggabungkan kedua nilai untuk mendapatkan jumlah koneksi absolut.

Jika Anda ingin mendapatkan informasi dari kernel itu sendiri, Anda dapat menggunakan NETLINK_INET_DIAGuntuk mendapatkan informasi dari kernel tanpa harus membacanya/proc

Ulrich Dangel
sumber
1
Saya akan penasaran melihat tes pada sistem dengan banyak koneksi membandingkan kinerja solusi saya vs solusi yang disarankan di atas yang membutuhkan aritmatika dan penyaringan tambahan untuk mendapatkan jawaban akhir, yang hanya satu nomor!
Johan
7

Cara yang lebih cepat? Dengan cara itu menghasilkan jawaban dalam sepersekian detik, bahkan butuh 0,009 detik di komputer saya!

Apakah Anda mencari cara yang tidak terlalu banyak mengetik? Dalam hal ini atur alias, mis

alias tcpcount="wc -l /proc/net/tcp"

Anda sekarang dapat memasukkan alias saja, mis. tcpcountAdalah apa yang saya gunakan dalam contoh saya, untuk mendapatkan nomor ini.

Masukkan baris atau tambahkan ke .bashrc Anda sehingga alias akan didefinisikan setiap kali Anda masuk.

Untuk sejumlah besar koneksi, yang berikut ini mungkin dapat berjalan sedikit lebih cepat (Dan sedikit lebih lambat untuk jumlah koneksi yang sangat kecil):

#!/bin/bash
/usr/bin/tail -1 /proc/net/tcp | (IFS=:
read COUNT DISCARD
echo $COUNT
)

Atau mungkin ...

awk 'END {print NR}' /proc/net/tcp

Kedua solusi ini mengasumsikan bahwa "wc" tidak terlalu optimal untuk hanya menghitung jumlah garis. Pengujian saya menunjukkan bahwa asumsi ini benar.

Yang pertama bekerja pada premis bahwa perintah ekor benar-benar pandai membuang data yang tidak dibutuhkan, sedemikian rupa sehingga membuat untuk membuat sub-shell ekstra dan melakukan pekerjaan tambahan pada variabel lingkungan. Ini memanfaatkan fakta bahwa baris di / proc / net / tcp sudah diberi nomor untuk menghilangkan kebutuhan untuk menghitung baris. Solusi akhir mengasumsikan bahwa jumlah awk cukup baik untuk mengimbangi kerugian apa pun karena memuat program yang lebih besar vs menciptakan banyak proses. Solusi awk memiliki manfaat tambahan yang cocok dengan definisi alias satu baris sederhana (yang memberikan manfaat tambahan karena tidak ada skrip yang dipanggil, sehingga tidak ada proses shell tambahan yang bercabang, memberikan keuntungan mili-detik tambahan.)

Johan
sumber
1
Saya memiliki koneksi 40k + di mana dibutuhkan lebih dari 3 detik
daisy
2
Hmm, saya pikir tidak ada cara yang jauh lebih cepat daripada membaca /proc/net/tcp. Anda dapat mencoba netstat -n -t | wc -l, tetapi tebakan saya adalah bahwa netstat juga membaca dari/proc/net/tcp
Kotte
netstat lebih dari 3 kali lebih lambat daripada membaca / proc / net / tcp di sistem saya, tapi itu dengan jumlah koneksi yang sangat kecil, jadi mungkin beberapa overhead startup akan dimitigasi jika jumlah koneksi besar. netstat membuatnya mudah untuk mendapatkan jumlah koneksi di berbagai negara ....
Johan
1
Pada server dengan RAM 16 GB, sekarang dibutuhkan lebih dari satu menit untuk melakukannya netstat -ntdengan sekitar 180.000 koneksi. Saya tidak melihat alasan mengapa itu harus sangat lambat ... (membaca /proc/net/tcpjuga sangat lambat)
Marki555
1
Beberapa pengujian malu pada mesin dengan koneksi 180k menunjukkan bahwa awkpendekatan ini lebih lambat daripada wc. tailtampaknya setara dengan wc.
Felix Frank
-1

Gunakan ss -sperintah untuk mendapatkan jawaban terperinci.

pengguna3894067
sumber