Existe uma ferramenta que pode monitorar o uso da largura de banda de um único processo?

15

Encontrei um bom monitor que permite registrar uma variedade de dados de tempo de execução de um único processo. Estou procurando um equivalente que faça o mesmo para o uso da largura de banda. Idealmente, o comando deve ser parecido bwmon --pid 1 --log init.log. Existe tal? Ele pode ser executado sem privilégios de administrador?

tshepang
fonte
1
relacionados: superuser.com/questions/189128/...
akira
serverfault.com/questions/36586/…
Ciro Santilli deve ser executado

Respostas:

3

algo para você começar (apenas no caso de você querer escrever):

#!/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

comentários:

  • verifica apenas eth0
  • verifica a cada 1 segundo
  • funciona apenas no linux, mas outros unixes funcionam de forma semelhante (procfs ou o que for)
  • A saída pode ser armazenada em um sqlite.db com stat --printf="%N\n" /proc/PID/exe | cut -d ' ' -f 3
akira
fonte
11
Eu não acho que esse seja realmente um contador por processo; Eu acho que é apenas a contagem total de interfaces do ponto de vista do processo. Executei um ncpar cliente / servidor no host local, enviando um byte por segundo e observei /proc/<listening-nc-pid>/net/dev. Então eu corri um segundo ncpar, enviando na taxa máxima. O arquivo que eu estava assistindo muito obviamente contava os dados do segundo par junto com os do primeiro par. Executando no Linux 2.6.32.
Jander
Eu tive um erro function strftime never defined; foi corrigido com a instalação do gawk .
tshepang
4
@ Jander Isso está correto /proc/<pid>/net/deve /proc/net/devtem o mesmo conteúdo aqui. Portanto, o scipt relata apenas o tráfego para eth0, não para o processo especificado.
Scai
1
Confirmando que isso não é uma resposta. Ele mede o contador de interface para eth0, como visto pelo processo. Ele não conta os dados enviados pelo processo através dessa interface.
Navin
@ Navin uma resposta é qualquer coisa que tenta responder à pergunta. Uma resposta errada ainda é uma resposta. Se este estiver errado, você pode recusar, mas ainda é uma resposta.
terdon
6

Se você estiver satisfeito com a largura de banda de E / S geral usada (ou se o seu programa tiver quase inteiramente E / S de rede), você poderá assistir ao /proc/<pid>/ioarquivo. Você deseja os campos rchare wchar. Você pode subtrair read_bytese write_bytes, uma vez que eles representam leituras e gravações na camada de armazenamento. Consulte a seção 3.3 de http://www.kernel.org/doc/Documentation/filesystems/proc.txt .

Se você precisar de mais resolução ... talvez possa usar esse script usando script lsofe strace, embora seja doloroso acertar todos os casos de canto. A idéia básica é a de analisar a saída de strace -p <pid>, agarrando o primeiro parâmetro (= o descritor de arquivo) eo valor de retorno (= número de bytes) de read(), write(), send(), e recv()chamadas ( NOTA existem várias syscalls para ouvir; refúgio I' rastreado todos eles). Descartar valores negativos; eles indicam erros. Use lsof -p <pid>para descobrir quais descritores de arquivo são soquetes TCP / UDP e adicione as contagens por fd. Essa estratégia não exige raiz, desde que você seja o proprietário do processo que está inspecionando, mas seria realmente complicado escrever, muito menos escrever bem.

Jander
fonte
3

tente nethogs :

O NetHogs é uma pequena ferramenta 'net top'. Em vez de dividir o tráfego por protocolo ou sub-rede, como a maioria das ferramentas, agrupa a largura de banda por processo. O NetHogs não depende de um módulo especial do kernel para ser carregado. Se de repente houver muito tráfego de rede, você poderá ativar o NetHogs e ver imediatamente qual PID está causando isso. Isso facilita a identificação de programas que foram malucos e estão subitamente ocupando sua largura de banda.
akira
fonte
2
Infelizmente, ele não pode monitorar um único processo e não registra. O segundo requisito (log) é muito mais importante que o primeiro. Ah, e ele não é executado sem privilégios de administrador :(
tshepang
1
Você quase certamente precisará de privilégios de root para isso.
Falmarri 5/02
Você pode tentar usar nethogs com o sinalizador -t (tracemode). A saída resultante pode então ser analisada para extrair o tráfego do único processo que você está interessado.
Valerio Schiavoni