Como devo determinar a atual utilização da rede?

5

Eu quero mostrar a atual utilização da rede (uso da largura de banda) de uma interface de uma caixa Debian em um site. Não é suposto ser muito elaborado ou preciso, apenas um número simples como "52 Mbit / s".

Monitores típicos de largura de banda de rede, como iftop , não me dão como simplesmente extrair esse valor.

Como posso recuperá-lo melhor?

Por exemplo, acho que posso analisar /proc/net/dev a cada poucos minutos. Não tenho certeza se essa é realmente a melhor maneira de fazer isso.

    
por Christoph Wurm 18.09.2011 / 17:24

4 respostas

9

Acho que o ifstat irá ajudá-lo:

[root@localhost ~]# ifstat -i eth0 -q 1 1
       eth0
 KB/s in  KB/s out
 3390.26     69.69
    
por 19.09.2011 / 01:01
6

A melhor maneira de fazer isso é simplesmente analisar /proc/net/dev (seja avisado que /proc não é portátil). Aqui está um script bash que eu juntei rapidamente e que deve ser capaz de calcular:

#!/bin/bash

_die() {
    printf '%s\n' "$@"
    exit 1
}

_interface=$1

[[ ${_interface} ]] || _die 'Usage: ifspeed [interface]'
grep -q "^ *${_interface}:" /proc/net/dev || _die "Interface ${_interface} not found in /proc/net/dev"

_interface_bytes_in_old=$(awk "/^ *${_interface}:/"' { if ($1 ~ /.*:[0-9][0-9]*/) { sub(/^.*:/, "") ; print $1 } else { print $2 } }' /proc/net/dev)
_interface_bytes_out_old=$(awk "/^ *${_interface}:/"' { if ($1 ~ /.*:[0-9][0-9]*/) { print $9 } else { print $10 } }' /proc/net/dev)

while sleep 1; do
    _interface_bytes_in_new=$(awk "/^ *${_interface}:/"' { if ($1 ~ /.*:[0-9][0-9]*/) { sub(/^.*:/, "") ; print $1 } else { print $2 } }' /proc/net/dev)
    _interface_bytes_out_new=$(awk "/^ *${_interface}:/"' { if ($1 ~ /.*:[0-9][0-9]*/) { print $9 } else { print $10 } }' /proc/net/dev)

    printf '%s: %s\n' 'Bytes in/sec'  "$(( _interface_bytes_in_new - _interface_bytes_in_old ))" \
                      'Bytes out/sec' "$(( _interface_bytes_out_new - _interface_bytes_out_old ))"

    # printf '%s: %s\n' 'Kilobytes in/sec'  "$(( ( _interface_bytes_in_new - _interface_bytes_in_old ) / 1024 ))" \
    #                   'Kilobytes out/sec' "$(( ( _interface_bytes_out_new - _interface_bytes_out_old ) / 1024 ))"

    # printf '%s: %s\n' 'Megabits in/sec'  "$(( ( _interface_bytes_in_new - _interface_bytes_in_old ) / 131072 ))" \
    #                   'Megabits out/sec' "$(( ( _interface_bytes_out_new - _interface_bytes_out_old ) / 131072 ))"

    _interface_bytes_in_old=${_interface_bytes_in_new}
    _interface_bytes_out_old=${_interface_bytes_out_new}
done

Tenha em mente que sleep não considera o tempo necessário para executar as operações no loop while, portanto, isso é (muito ligeiramente) impreciso. No meu coppermine de 600mhz, o loop leva 0,011 segundos - uma imprecisão desprezível para a maioria dos propósitos. Tenha em mente também ao usar as saídas de kilobyte / megabit (comentadas), o bash apenas entende a aritmética de inteiros.

    
por 18.09.2011 / 18:01
3

Existem monitores de tráfego de rede, como vnstat  que mantém registros mensais de seu tráfego, ou slurm , que leva seus valores diretamente daqueles armazenados no kernel. Está disponível na maioria das reposições de distro.

Veja o que vejo quando executo slurm -i ra0 :

    
por 19.09.2011 / 23:15
0

Aqui está um script de shell muito simples para calcular isso:

#!/bin/sh

dev=$1

grep -q "^$dev:" /proc/net/dev || exec echo "$dev: no such device"

read rx <"/sys/class/net/$dev/statistics/rx_bytes"
read tx <"/sys/class/net/$dev/statistics/tx_bytes"

while sleep 1; do
    read newrx <"/sys/class/net/$dev/statistics/rx_bytes"
    read newtx <"/sys/class/net/$dev/statistics/tx_bytes"

    # convert bytes to kbit/s: bytes * 8 / 1000 => bytes / 125
    echo "$dev  {rx: $(((newrx-rx) / 125)), tx: $(((newtx-tx) / 125))}"

    rx=$newrx
    tx=$newtx
done

inicie o script passando o nome da interface, por exemplo. ./shtraf eth1

    
por 07.02.2018 / 16:27