Obtener el recuento actual de conexiones TCP en un sistema

22

En lugar de hacerlo wc -l /proc/net/tcp, ¿hay una forma más rápida de hacerlo?

Solo necesito un recuento total de conexiones TCP.

margarita
fuente
55
Tal vez intentess -s
Ulrich Dangel
@UlrichDangel genial, eso es más rápido, leyendo sockstat; puedes poner eso en el área de respuesta ;-)
daisy

Respuestas:

20

Si solo desea obtener el número y no necesita ningún detalle, puede leer los datos /proc/net/sockstat{,6}. Tenga en cuenta que debe combinar ambos valores para obtener el recuento absoluto de conexiones.

Si desea obtener la información del núcleo mismo, puede utilizarla NETLINK_INET_DIAGpara obtener la información del núcleo sin tener que leerla./proc

Ulrich Dangel
fuente
1
Sería curioso ver una prueba en un sistema con muchas conexiones que compara el rendimiento de mi solución con la solución sugerida anteriormente que requiere aritmética y filtrado adicionales para obtener la respuesta final, ¡que es solo un número!
Johan
7

¿Una forma más rápida? De esa manera, produce una respuesta en una fracción de segundo, de hecho, ¡toma 0.009 segundos en mi computadora!

¿Estás buscando una forma que requiera menos tipeo? En ese caso, establezca un alias, por ejemplo

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

Ahora puede ingresar el aliasname, por ejemplo, tcpcountes lo que usé en mi ejemplo, para obtener este número.

Ingrese la línea o agréguela a su .bashrc para que el alias se defina cada vez que inicie sesión.

Para un gran número de conexiones, lo siguiente puede ejecutarse un poco más rápido (y un poco más lento para un número muy pequeño de conexiones):

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

O tal vez ...

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

Ambas soluciones suponen que "wc" no es muy óptimo para contar el número de líneas. Mi prueba muestra que esta suposición es cierta.

El primero funciona bajo la premisa de que el comando tail es realmente bueno para descartar datos innecesarios, tanto que compensa la creación de un sub-shell adicional y hace un trabajo adicional en las variables de entorno. Aprovecha el hecho de que las líneas en / proc / net / tcp ya están numeradas para eliminar la necesidad de contar las líneas. La solución final supone que awk cuenta lo suficientemente bien como para compensar cualquier desventaja debido a la carga de un programa más grande frente a la creación de múltiples procesos. La solución awk tiene el beneficio adicional de que encaja perfectamente en una simple definición de alias de una línea (que brinda beneficios adicionales porque no se llama script, por lo tanto no hay procesos de shell adicionales bifurcados, lo que brinda una ventaja adicional de milisegundos).

Johan
fuente
1
Tengo una conexión de 40k + donde toma más de 3 segundos
daisy
2
Hmm, no creo que haya una forma mucho más rápida de leer /proc/net/tcp. Puede intentarlo netstat -n -t | wc -l, pero supongo que netstat también lee/proc/net/tcp
Kotte
netstat es más de 3 veces más lento que leer / proc / net / tcp en mi sistema, pero eso es con un número muy pequeño de conexiones, por lo que puede ser que algunos gastos generales de inicio se mitiguen si el número de conexiones es grande. netstat facilita el recuento de conexiones en diferentes estados ...
Johan
1
En un servidor con 16 GB de RAM, ahora se tarda más de un minuto en hacer netstat -ntcon aproximadamente 180,000 conexiones. No veo ninguna razón por la que debería ser tan lento ... (la lectura /proc/net/tcptambién es muy lenta)
Marki555
1
Algunas pruebas tímidas en una máquina con conexiones de 180k indican que el awkenfoque es lamentablemente más lento que wc. tailparece estar a la par con wc.
Felix Frank
-1

Use el ss -scomando para obtener la respuesta detallada.

usuario3894067
fuente