¿Cómo puedo medir el tráfico de red utilizado por un comando?

1

A menudo escribo:

time npm install

que me dará como resultado:

real    0m22.933s
user    0m24.058s
sys     0m3.346s

Me gustaría tener el mismo tipo de información, pero para el consumo de la red.

Por ejemplo,

netmeasure npm install

volvería :

Upload : 499kb
Download : 44MB

Sería útil poder hacer "pruebas de regresión" en algunos programas.

¿Es posible obtener este tipo de información con herramientas simples de Unix?

Ya lo he intentado nethogs, pero es algo muy interactivo, que podría ser útil si desea saber qué está sucediendo en un sistema Unix completo, pero estoy interesado en medir el consumo de red de un comando. No estoy buscando un programa interactivo, sino uno que genere el proceso para mí y espere hasta que exista para mostrar esas estadísticas.

He encontrado https://github.com/jonasdn/nsntrace que parece una buena herramienta, pero dentro de nsntrace, no tengo conectividad (vea el problema https://github.com/jonasdn/nsntrace/issues/22 )

edi9999
fuente

Respuestas:

1

También habría sugerido ejecutar el programa que desea dentro de un espacio de nombres de red, que es exactamente lo nstraceque hace la herramienta, aunque no entiendo por qué no simplemente escriben la configuración del espacio de nombres.

La nsntraceherramienta requiere reenvío y se utiliza iptablespara enmascarar la conexión del par veth en el espacio de nombres de la red principal a la interfaz saliente. Es muy probable que haya salido mal porque lo que hace no es compatible con su configuración de Internet. Especialmente los problemas del servidor de nombres en los espacios de nombres de red son un poco complicados.

Por lo tanto, le sugiero que lea sobre el espacio de nombres de red ( ip netns), el enmascaramiento iptablesy el solucionador de DNS ( /etc/resolv.conf, /etc/netns/NAME/resolv.conf) para poder averiguar exactamente qué salió mal.

Aquí hay un script que utilizo para configurar un espacio de nombres de red e iniciar un xterm "dentro" de este espacio de nombres, si eso ayuda:

#!/bin/bash

# Setup network namespace with veth pair, start xterm in it

# nsterm ns0 veth0 10.0.0 yellow 24

if [[ $EUID -ne 0 ]]; then
   echo "This script must be run as root" 1>&2
   exit 1
fi

NS=${1:-ns0}
DEV=${2:-veth0}
DEV_A=${DEV}a
DEV_B=${DEV}b
ADDR=${3-:10.0.0}
ADDR_A=${ADDR}.254
ADDR_B=${ADDR}.1
MASK=${5:-24}
COL=${4:-yellow}

# echo ns=$NS dev=$DEV col=$COL mask=$MASK

ip netns add $NS
ip link add $DEV_A type veth peer name $DEV_B netns $NS
ip addr add $ADDR_A/$MASK dev $DEV_A
ip link set ${DEV}a up
ip netns exec $NS ip addr add $ADDR_B/$MASK dev $DEV_B
ip netns exec $NS ip link set ${DEV}b up
ip netns exec $NS ip route add default via $ADDR_A dev $DEV_B
ip netns exec $NS su -c "xterm -bg $COL &" YOUR_USERNAME

Adaptarse según sea necesario (después de leerlo para comprender lo que hace). Aún necesita habilitar el reenvío

echo "1" | sudo tee /proc/sys/net/ipv4/ip_forward

y configuración enmascarada en cualquier forma necesaria.

Me temo que no puedo pensar en una solución más simple para medir el uso exacto de la red.

dirkt
fuente
0

Puede obtener una aproximación con algunos comandos básicos. Probablemente nstracesea ​​mejor, pero no pude encontrarlo en mi distribución.

Todo lo que necesita hacer es examinar las llamadas al sistema utilizadas por la aplicación. Una aplicación que quiere leer de la red necesita llamar a algo de la recvfamilia o read. Si desea enviar algo, utiliza writeo sendfamilia de llamadas al sistema. Nuestra heurística se saltará ready write, dado que es demasiado difícil de analizar para una sola línea.

Así que, aquí vamos:

  1. Guardar llamadas del sistema utilizadas por la aplicación en un archivo: strace myapp 2>syscalls
  2. grepla llamada al sistema requerida (en este caso enviar), tome su valor de retorno (último bloque de dígitos después del =signo) y cuente su suma.grep "send" syscalls | grep -E --only-matching "= [0-9]+$" | awk '{ print $2 }' | paste -sd+ | bc

Reitero: esta frase no siempre le dará el resultado correcto, pero debería funcionar la mayoría de las veces.

mosca de espuma de poliestireno
fuente