Abrufen der aktuellen TCP-Verbindungsanzahl auf einem System

22

Gibt wc -l /proc/net/tcpes einen schnelleren Weg, als dies zu tun?

Ich brauche nur eine Gesamtzahl von TCP-Verbindungen.

Gänseblümchen
quelle
5
Vielleicht versuchenss -s
Ulrich Dangel
@UlrichDangel cool, das geht schneller, wenn man sockstat liest; Sie können das tatsächlich in den Antwortbereich stellen ;-)
Daisy

Antworten:

20

Wenn Sie nur die Nummer erhalten möchten und keine Details benötigen, können Sie die Daten von lesen /proc/net/sockstat{,6}. Bitte beachten Sie, dass Sie beide Werte kombinieren müssen, um die absolute Anzahl der Verbindungen zu erhalten.

Wenn Sie die Informationen aus dem Kernel selbst abrufen möchten, können Sie sie verwenden NETLINK_INET_DIAG, um die Informationen aus dem Kernel abzurufen, ohne sie lesen zu müssen/proc

Ulrich Dangel
quelle
1
Ich wäre neugierig, einen Test auf einem System mit vielen Verbindungen zu sehen, bei dem die Leistung meiner Lösung mit der oben vorgeschlagenen Lösung verglichen wird, für die zusätzliche Arithmetik und Filterung erforderlich sind, um die endgültige Antwort zu erhalten, bei der es sich lediglich um eine einzelne Zahl handelt!
Johan
7

Ein schneller Weg? Auf diese Weise wird eine Antwort im Bruchteil einer Sekunde erstellt. Auf meinem Computer dauert dies 0,009 Sekunden!

Suchen Sie einen Weg, der weniger Tippen erfordert? In diesem Fall legen Sie einen Alias ​​fest, z

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

Sie können jetzt einfach den Aliasnamen eingeben, z. B. tcpcountdas, was ich in meinem Beispiel verwendet habe, um diese Nummer zu erhalten.

Geben Sie die Zeile ein oder fügen Sie sie zu Ihrer .bashrc-Datei hinzu, damit der Alias ​​bei jeder Anmeldung definiert wird.

Bei einer großen Anzahl von Verbindungen kann Folgendes möglicherweise etwas schneller ausgeführt werden (und bei einer sehr kleinen Anzahl von Verbindungen etwas langsamer):

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

Oder vielleicht ...

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

Beide Lösungen gehen davon aus, dass "wc" nicht optimal ist, um nur die Anzahl der Zeilen zu zählen. Meine Tests zeigen, dass diese Annahme wahr ist.

Der erste geht davon aus, dass der Befehl tail wirklich gut darin ist, nicht benötigte Daten zu verwerfen, so dass er das Erstellen einer zusätzlichen Sub-Shell und die zusätzliche Bearbeitung von Umgebungsvariablen wieder wettmacht. Es nutzt die Tatsache, dass die Zeilen in / proc / net / tcp bereits nummeriert sind, um das Zählen der Zeilen zu vermeiden. Bei der endgültigen Lösung wird davon ausgegangen, dass awk gut genug zählt, um Nachteile durch das Laden eines größeren Programms gegenüber dem Erstellen mehrerer Prozesse auszugleichen. Die awk-Lösung hat den zusätzlichen Vorteil, dass sie gut in eine einfache einzeilige Alias-Definition passt (was zusätzliche Vorteile bietet, da kein Skript aufgerufen wird und somit keine zusätzlichen Shell-Prozesse gegabelt werden, was einen zusätzlichen Vorteil von Millisekunden bietet.)

Johan
quelle
1
Ich habe 40k + Verbindung, wo es mehr als 3 Sekunden dauert
Daisy
2
Hmm, ich glaube nicht, dass es einen viel schnelleren Weg gibt, als davon zu lesen /proc/net/tcp. Sie können es versuchen netstat -n -t | wc -l, aber ich vermute, dass netstat auch von/proc/net/tcp
Kotte
netstat ist mehr als dreimal langsamer als das Lesen von / proc / net / tcp auf meinem System, aber das ist mit einer sehr geringen Anzahl von Verbindungen verbunden, so dass es sein kann, dass bei einer großen Anzahl von Verbindungen ein gewisser Start-Overhead verringert wird. netstat macht es einfach, Verbindungen in verschiedenen Bundesstaaten zu zählen ...
Johan
1
Auf einem Server mit 16 GB RAM dauert es jetzt mehr als eine Minute, um eine Verbindung netstat -ntmit ca. 180.000 Verbindungen herzustellen. Ich sehe keinen Grund, warum es so langsam sein sollte ... (Lesen /proc/net/tcpist auch sehr langsam)
Marki555
1
Einige schüchterne Tests auf einem Computer mit 180.000 Verbindungen zeigen, dass der awkAnsatz bedauerlicherweise langsamer ist als wc. tailscheint auf Augenhöhe zu sein wc.
Felix Frank
-1

Verwenden Sie den ss -sBefehl, um die detaillierte Antwort zu erhalten.

user3894067
quelle