Como posso medir o tráfego de rede usado por um comando?

1

Escrevo com frequência:

time npm install

que me dará como resultado:

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

Eu gostaria de ter o mesmo tipo de informação, mas para consumo de rede.

Por exemplo,

netmeasure npm install

retornaria:

Upload : 499kb
Download : 44MB

Isso seria útil para fazer "testes de regressão" em alguns programas.

É possível obter este tipo de informação com ferramentas unix simples?

Já experimentei nethogs , mas é algo muito interativo, o que pode ser útil se você quiser saber o que está acontecendo em um sistema unix completo, mas estou interessado em medir o consumo de rede de um comando. Eu não estou procurando por um programa interativo, mas um que irá gerar o processo para mim e esperar até que ele exista para mostrar essas estatísticas.

Eu encontrei o link que parece ser uma boa ferramenta, mas dentro do nsntrace, eu não tenho conectividade (veja a edição link )

    
por edi9999 30.06.2017 / 12:24

2 respostas

1

Eu também sugeriria executar o programa que você deseja dentro de um namespace de rede, que é exatamente o que a ferramenta nstrace faz, embora eu não entenda por que eles simplesmente não criam scripts para a configuração do namespace. / p>

A ferramenta nsntrace requer o encaminhamento e usa iptables para mascarar a conexão veth-pair no namespace da rede principal para a interface de saída. Muito provavelmente isso deu errado porque o que ele faz não é compatível com sua configuração de internet. Especialmente os problemas do servidor de nomes nos namespaces de rede são um pouco complicados.

Então sugiro que você leia o namespace da rede ( ip netns ), o masquerading, iptables e o resolvedor de DNS ( /etc/resolv.conf , /etc/netns/NAME/resolv.conf ) para descobrir exatamente o que deu errado.

Aqui está um script que eu uso para configurar um namespace de rede e iniciar um xterm "dentro" deste namespace, se isso ajudar:

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

Adapte conforme necessário (depois de ler o texto para entender o que ele faz). Você ainda precisa ativar o encaminhamento

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

e configuração mascarada em qualquer formato necessário.

Infelizmente, não consigo pensar em uma solução mais simples para medir o uso exato da rede.

    
por 01.07.2017 / 10:43
0

Você pode obter uma aproximação com alguns comandos básicos. Provavelmente nstrace é melhor, mas não consegui encontrá-lo na minha distro.

Tudo o que você precisa fazer é examinar as chamadas do sistema usadas pelo aplicativo. Um aplicativo que deseja ler da rede precisa chamar algo de recv family ou read . Se você quiser enviar algo, use write ou send da família de syscalls. Nossa heurística pulará read e write , já que é muito difícil para o one-liner analisar.

Então, aqui vamos nós:

  1. Salvar as chamadas do sistema usadas pelo aplicativo em um arquivo: strace myapp 2>syscalls
  2. grep o syscall necessário (nesse caso, enviar), pegue seu valor de retorno (último bloco de dígitos após o sinal = ) e conte sua soma. %código%

Eu reitero: este one-liner não sempre lhe dará o resultado correto, mas deve funcionar na maioria das vezes.

    
por 01.07.2017 / 11:03