¿Existe alguna herramienta que pueda monitorear el uso de ancho de banda de un solo proceso?

15

He encontrado un buen monitor que me permite registrar una variedad de datos de tiempo de ejecución de un solo proceso. Estoy buscando un equivalente que haga lo mismo para el uso de ancho de banda. Idealmente, el comando debería verse así bwmon --pid 1 --log init.log. ¿Hay tal? ¿Se puede ejecutar sin privilegios de administrador?

tshepang
fuente
1
relacionado: superuser.com/questions/189128/…
akira
serverfault.com/questions/36586/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Respuestas:

3

algo para comenzar (en caso de que quiera escribirlo usted mismo):

#!/bin/bash
#
# usage: bwmon PID

IN=0; OUT=0; TIME=0

get_traffic() {
    t=`awk '/eth0:/ { printf("%s,%d,%d\n",strftime("%s"),$2,$10); }' < /proc/$1/net/dev`
    IN=${t#*,}; IN=${IN%,*}
    OUT=${t##*,};
    TIME=${t%%,*};
}

get_traffic $1
while true
do
    _IN=$IN; _OUT=$OUT; _TIME=$TIME
    get_traffic $1
    echo "$TIME,$(( $TIME - $_TIME )),$IN,$(( $IN - $_IN )),$OUT,$(( $OUT - $_OUT))"
    sleep 1
done

comentarios:

  • comprueba solo eth0
  • comprueba cada 1 segundo
  • funciona solo en Linux, pero otros Unix funcionan de manera similar (procfs o lo que sea)
  • la salida podría almacenarse en un sqlite.db con stat --printf="%N\n" /proc/PID/exe | cut -d ' ' -f 3
akira
fuente
11
No creo que esto sea realmente un contador por proceso; Creo que es solo el recuento total de la interfaz desde el punto de vista del proceso. Ejecuté un ncpar cliente / servidor sobre localhost, enviando un byte por segundo, y observé /proc/<listening-nc-pid>/net/dev. Luego ejecuté un segundo ncpar, enviando a la velocidad máxima. El archivo que estaba viendo obviamente contaba los datos del segundo par junto con los del primer par. Ejecutando en Linux 2.6.32.
Jander
Tuve un error function strftime never defined; Se solucionó instalando gawk .
tshepang
44
@Jander Eso es correcto, /proc/<pid>/net/devy /proc/net/devtiene el mismo contenido aquí. Por lo tanto, el scipt solo informa el tráfico para eth0, no para el proceso dado.
scai
1
Confirmando que esto no es una respuesta. Mide el contador de la interfaz eth0, como se ve en el proceso. No , no cuenta los datos enviados por el proceso a través de esa interfaz.
Navin
@Navin una respuesta es cualquier cosa que intente responder la pregunta. Una respuesta incorrecta sigue siendo una respuesta. Si este está equivocado, entonces puede rechazarlo, pero sigue siendo una respuesta.
terdon
6

Si está satisfecho con el ancho de banda general de E / S utilizado (o si su programa funciona casi completamente con E / S de red), puede ver el /proc/<pid>/ioarchivo. Quieres los campos rchary wchar. Es posible que desee restar read_bytesy write_bytes, ya que representan lecturas y escrituras en la capa de almacenamiento. Consulte la sección 3.3 de http://www.kernel.org/doc/Documentation/filesystems/proc.txt .

Si necesita más resolución ... tal vez podría escribir esto usando lsofy strace, aunque sería doloroso tener todos los casos de esquina correctos. La idea básica es la de analizar la salida de strace -p <pid>, agarrando el primer parámetro (= el descriptor de archivo) y el valor de retorno (= número de bytes) de read(), write(), send(), y recv()las llamadas ( NOTA hay varios más llamadas al sistema para escuchar; remanso I' los rastreé a todos). Descartar valores negativos; Indican errores. Use lsof -p <pid>para averiguar qué descriptores de archivo son sockets TCP / UDP y sume los recuentos por fd. Esta estrategia no requiere root siempre y cuando sea el propietario del proceso que está inspeccionando, pero sería realmente complicado escribir, y mucho menos escribir bien.

Jander
fuente
3

prueba nethogs :

NetHogs es una pequeña herramienta 'net top'. En lugar de desglosar el tráfico por protocolo o por subred, como la mayoría de las herramientas, agrupa el ancho de banda por proceso. NetHogs no se basa en un módulo especial del núcleo para cargarse. Si de repente hay mucho tráfico de red, puede iniciar NetHogs e inmediatamente ver qué PID está causando esto. Esto facilita la identificación de programas que se han vuelto locos y de repente están ocupando su ancho de banda.
akira
fuente
2
Lamentablemente, no puede monitorear un solo proceso y no se registra. Sin embargo, el segundo requisito (registro) es mucho más importante que el primero. Ah, y no se ejecuta sin privilegios de administrador :(
tshepang
1
Seguramente necesitará privilegios de root para esto.
Falmarri
Puede intentar usar nethogs con el indicador -t (tracemode). El resultado resultante podría analizarse para extraer el tráfico del proceso único que le interesa.
Valerio Schiavoni