Bir sistemde mevcut TCP bağlantı sayısının alınması


22

Yapmak yerine, wc -l /proc/net/tcpdaha hızlı yapmanın bir yolu var mı?

Sadece toplam tcp bağlantısına ihtiyacım var.


5
Belki deneyinss -s
Ulrich Dangel

@UlrichDangel, sockstat okuyarak çok daha hızlı. Aslında cevap alanına koyabilirsiniz ;-)
Daisy

Yanıtlar:


20

Sadece numarayı almak istiyorsanız ve hiçbir ayrıntıya gerek duymuyorsanız, verileri okuyabilirsiniz /proc/net/sockstat{,6}. Mutlak bağlantı sayısını elde etmek için her iki değeri de birleştirmeniz gerektiğini lütfen unutmayın.

Eğer bilgiyi çekirdeğin kendisinden almak istiyorsanız NETLINK_INET_DIAG, bilgiyi okumak zorunda kalmadan çekirdeğin bilgisini almak için kullanabilirsiniz ./proc


1
Çözümümün performansını karşılaştıran birçok bağlantıya sahip bir sistem üzerinde bir test görmek istiyorum - yukarıda önerilen çözüm, son cevabı elde etmek için ek aritmetik ve filtreleme gerektiren, sadece tek bir sayı.
Johan

7

Daha hızlı bir yol mu? Bu yol saniyeler içinde cevap veriyor, aslında bilgisayarımda 0.009 saniye sürüyor!

Daha az yazma gerektiren bir yol mu arıyorsunuz? Bu durumda bir takma isim belirleyin, örn.

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

Şimdi sadece takma adı girebilirsiniz, örneğin tcpcountbu numarayı almak için örneğimde kullandığım şey.

Satırı girin veya .bashrc'nize ekleyin, böylece takma ad her giriş yaptığınızda tanımlanır.

Çok sayıda bağlantı için aşağıdakiler muhtemelen biraz daha hızlı çalışabilir (Çok az sayıda bağlantı için biraz daha yavaş):

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

Ya da belki ...

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

Bu çözümlerin her ikisi de, "wc" nin sadece satır sayısını saymak için çok uygun olmadığını varsaymaktadır. Testim bu varsayımın doğru olduğunu gösteriyor.

İlki, kuyruk komutunun gereksiz verileri atmakta gerçekten iyi olduğu için işe yarıyor, öyle ki, fazladan bir alt kabuk oluşturmak ve çevre değişkenleri üzerinde ekstra iş yapmak için oluşturuyor. / Proc / net / tcp içindeki satırların satırları sayma ihtiyacını ortadan kaldırmak için zaten numaralandırılmış olması gerçeğini kullanır. Son çözüm, awk'nin birden fazla işlem oluşturmak yerine daha büyük bir program yüklemek nedeniyle herhangi bir dezavantajı telafi etmek için yeterince saydığını varsaymaktadır. Awk çözümü, basit bir tek satırlı takma ad tanımına güzel bir şekilde uyması konusunda ilave bir avantaja sahiptir.


1
3 saniyeden fazla süren 40k + bağlantım var
papatya

2
Hmm, okumadan çok daha hızlı bir yol olduğunu sanmıyorum /proc/net/tcp. Deneyebilirsin netstat -n -t | wc -l, ama benim tahminim şu ki, netstat da okuyor/proc/net/tcp
Kotte

netstat, sistemimde / proc / net / tcp'yi okumaktan 3 kat daha yavaş, ancak çok az sayıda bağlantıyla, bu nedenle bağlantı sayısı büyükse bazı başlangıç ​​ek yüklerinin azaltılması olabilir. netstat, farklı eyaletlerdeki bağlantıların sayısını almayı kolaylaştırıyor ....
Johan

1
16 GB RAM'e sahip bir sunucuda, şimdi netstat -ntyaklaşık 180.000 bağlantıyla bir dakikadan fazla zaman alıyor . Neden bu kadar yavaş olması gerektiğine dair bir neden göremiyorum ... (okuma /proc/net/tcpda çok yavaş)
Marki555

1
180k bağlantılı bir makinede yapılan bazı utangaç testler, awkyaklaşımın çok daha yavaş olduğunu göstermektedir wc. tailile eşit görünüyor wc.
Felix Frank,

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.