Seu aplicativo provavelmente está enviando pacotes para um número de porta UDP ou TCP específico ou para um endereço IP específico.
Portanto, você pode usar algo como TCPdump para capturar esse tráfego.
O TCPdump não fornece as estatísticas em tempo real que você deseja, mas você pode alimentá-lo com algo que funcione (tentarei atualizar esta resposta com uma resposta posteriormente).
Atualizar:
$ sudo tcpdump -i eth1 -l -e -n | ./netbps
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 96 bytes
11:36:53 2143.33 Bps
11:37:03 1995.99 Bps
11:37:13 2008.35 Bps
11:37:23 1999.97 Bps
11:37:33 2083.32 Bps
131 packets captured
131 packets received by filter
0 packets dropped by kernel
Eu o interrompi depois de um minuto pressionando Ctrl + C.
Você precisaria adicionar uma expressão de filtro adequada no final do tcpdump
comando para incluir apenas o tráfego gerado pelo seu aplicativo (por exemplo port 123
)
O programa netbps
é este:
#!/usr/bin/perl
use strict;
use warnings;
use Time::HiRes;
my $reporting_interval = 10.0; # seconds
my $bytes_this_interval = 0;
my $start_time = [Time::HiRes::gettimeofday()];
STDOUT->autoflush(1);
while (<>) {
if (/ length (\d+):/) {
$bytes_this_interval += $1;
my $elapsed_seconds = Time::HiRes::tv_interval($start_time);
if ($elapsed_seconds > $reporting_interval) {
my $bps = $bytes_this_interval / $elapsed_seconds;
printf "%02d:%02d:%02d %10.2f Bps\n", (localtime())[2,1,0],$bps;
$start_time = [Time::HiRes::gettimeofday()];
$bytes_this_interval = 0;
}
}
}
É apenas um exemplo, ajuste a gosto.
vnstat -tr
Uso abaixo da mesma pasta:
Para verificar o empacotador por interface:
./netpps.sh eth0
Para verificar a velocidade por interface:
./netspeed.sh eth0
Medir pacotes por segundo em uma interface netpps.sh como nome do arquivo
Meça a largura de banda da rede em uma interface netspeed.sh como nome do arquivo
Consulte este site para obter mais informações http://xmodulo.com/measure-packets-per-second-throughput-high-speed-network-interface.html
fonte
Mais fácil de usar e mais fácil de controlar a saída e redirecionar para arquivo para registro contínuo:
Provavelmente vem com a maioria das distribuições linux e pode ser instalado com o brew no mac
fonte
Eu acho que você pode usar a interface proc para obter as informações necessárias. Eu criei esse pequeno script de shell chamado rt_traf.sh:
Isso imprimirá os octetos de entrada e saída separados por uma guia. Octetos multiplicados por 8 fornecerão bits / segundo e, em seguida, divididos por 10 ^ 6 fornecerão megabits / segundo. É claro que você pode adicionar isso ao script de shell para formatar a saída da maneira que desejar. Você pode chamar isso com o PID do seu aplicativo, assim, o
./rt_traf.sh <PID>
que fornecerá uma leitura instantânea do seu aplicativo desde a inicialização. Para assistir estatísticas em tempo real por segundo, você pode agrupar o script shell no comando watch:O
-n
parâmetro pode ser ajustado até décimos de segundo. Para fazer um cálculo ao longo do tempo, eu faria algo assim:Novamente, a matemática pode ser ajustada para o tamanho / hora que você precisa. Não é a solução mais elegante ou encolhida, mas deve funcionar em uma pitada.
fonte
/proc/<pid>/net/netstat
retorna os mesmos dados queproc/net/netstat
, ie. você obtém os mesmos dados para qualquer / todos os processos.Eu só precisava medir a quantidade de tráfego mysql entrando e saindo em um sistema antigo em que o perl não funcionava corretamente, então não pude resistir a escrever algumas linhas de awk que atendem ao mesmo objetivo de medir o tráfego total visto pelo tcpdump:
E se você gosta mais de uma linha, aqui está uma para você:
fonte
else
declaração deve ser removida, caso contrário, as linhas serão ignoradas esum
não serão precisas.tcpdump -l -e -n port 3306 | awk '{t=substr($1,0,8);n=substr($9,0,length($9)-1);if(t!=pt){print t,sum;sum=0;};sum+=n;pt=t;}
Por aplicativo pode ser feito com uma regra de firewall usando xtables e uma modificação do abaixo.
Isso não responde à pergunta "por aplicativo", mas apenas à pergunta "por interface".
Abaixo está um script que funciona na maioria dos roteadores Linux incorporados, como os compatíveis com Ubiquiti e OpenWRT, e obtém seus detalhes em / proc / net / dev.
(E fácil de mudar para pacotes etc.)
Copie o acima para sua área de transferência e, em seguida, em uma sessão de terminal no seu roteador:
então: Ctrl + V (ou clique com o botão direito do mouse / Colar)
então: Ctrl + D
Você também pode colá-lo em um bloco de notas e repita o procedimento acima se precisar editá-lo - nem todos os roteadores incorporados têm um editor! Certifique-se de copiar tudo, desde o # na parte superior até o concluído; no fundo.
O exemplo netpps acima é ótimo BTW - mas nem todos os dispositivos possuem um sistema de arquivos montado / sys. Você também pode precisar alterar o / bin / bash para / bin / sh ou vice-versa.
Fonte: https://gist.github.com/dagelf/ab2bad26ce96fa8d79b0834cd8cab549
fonte