Obtention du nombre de connexions TCP actuelles sur un système

22

Au lieu de le faire wc -l /proc/net/tcp, existe-t-il un moyen plus rapide de le faire?

J'ai juste besoin d'un nombre total de connexions TCP.

Marguerite
la source
5
Essayez peut-êtress -s
Ulrich Dangel
@UlrichDangel cool, c'est plus rapide, en lisant sockstat; vous pouvez réellement mettre cela dans la zone de réponse ;-)
daisy

Réponses:

20

Si vous voulez simplement obtenir le numéro et n'avez pas besoin de détails, vous pouvez lire les données /proc/net/sockstat{,6}. N'oubliez pas que vous devez combiner les deux valeurs pour obtenir le nombre absolu de connexions.

Si vous voulez obtenir les informations du noyau lui-même, vous pouvez utiliser NETLINK_INET_DIAGpour obtenir les informations du noyau sans avoir à les lire/proc

Ulrich Dangel
la source
1
Je serais curieux de voir un test sur un système avec de nombreuses connexions comparant les performances de ma solution par rapport à la solution suggérée ci-dessus qui nécessite une arithmétique et un filtrage supplémentaires pour obtenir la réponse finale, qui n'est qu'un seul nombre!
Johan
7

Un moyen plus rapide? Cela produit une réponse en une fraction de seconde, en fait cela prend 0,009 secondes sur mon ordinateur!

Cherchez-vous un moyen qui nécessite moins de frappe? Dans ce cas, définissez un alias, par exemple

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

Vous pouvez maintenant simplement saisir le pseudonyme, par exemple, tcpcountc'est ce que j'ai utilisé dans mon exemple, pour obtenir ce numéro.

Saisissez la ligne ou ajoutez-la à votre .bashrc afin que l'alias soit défini à chaque connexion.

Pour un grand nombre de connexions, les opérations suivantes peuvent éventuellement s'exécuter un peu plus rapidement (et légèrement plus lentement pour un très petit nombre de connexions):

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

Ou peut-être ...

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

Ces deux solutions supposent que "wc" n'est pas très optimal pour simplement compter le nombre de lignes. Mes tests montrent que cette hypothèse est vraie.

Le premier part du principe que la commande tail est vraiment bonne pour éliminer les données inutiles, à tel point qu'elle compense la création d'un sous-shell supplémentaire et le travail supplémentaire sur les variables d'environnement. Il tire parti du fait que les lignes dans / proc / net / tcp sont déjà numérotées pour éliminer la nécessité de compter les lignes. La solution finale suppose que awk compte suffisamment bien pour compenser tout inconvénient dû au chargement d'un plus gros programme par rapport à la création de plusieurs processus. La solution awk a l'avantage supplémentaire de s'intégrer parfaitement dans une définition d'alias simple sur une seule ligne (ce qui offre des avantages supplémentaires en ce sens qu'aucun script n'est appelé, donc aucun processus de shell supplémentaire n'est prévu, ce qui donne un avantage supplémentaire en mili-secondes.)

Johan
la source
1
J'ai une connexion 40k + où cela prend plus de 3 secondes
marguerite
2
Hmm, je ne pense pas qu'il y ait un moyen beaucoup plus rapide que de lire /proc/net/tcp. Vous pouvez essayer netstat -n -t | wc -l, mais je suppose que netstat lit également à partir de/proc/net/tcp
Kotte
netstat est plus de 3 fois plus lent que la lecture de / proc / net / tcp sur mon système, mais avec un très petit nombre de connexions, il se peut donc que certains frais de démarrage soient atténués si le nombre de connexions est important. netstat permet d'obtenir facilement le nombre de connexions dans différents états ....
Johan
1
Sur un serveur avec 16 Go de RAM, il faut maintenant plus d'une minute pour faire un netstat -ntavec environ 180 000 connexions. Je ne vois aucune raison pour que ça soit si lent ... (la lecture /proc/net/tcpest aussi très lente)
Marki555
1
Des tests timides sur une machine avec des connexions à 180k indiquent que l' awkapproche est terriblement plus lente que wc. tailsemble être à égalité avec wc.
Felix Frank
-1

Utilisez la ss -scommande pour obtenir la réponse détaillée.

user3894067
la source