Como processar a saída do ifconfig para determinar a velocidade do meu link?

4

Aqui está o script que escrevi por tédio, para teste de velocidade de download:

#!/bin/bash

get_ispeed() {
    echo $(ifconfig eth0 | grep bytes | grep RX | cut -d ':' -f 2 | cut -d ' ' -f 1);
}

for((;;));
do
    s1='get_ispeed';

    sleep 1s;

    s2='get_ispeed';

    d=$(($s2-$s1));

    echo $(($d / 1000))" kB/s";
done

Não tenho certeza se está "fazendo o trabalho", embora eu não seja verdadeiro basista: p
Como o ifconfig gera bytes RX, eu o divido por 1000 para obter kB / s

    
por moe 05.08.2013 / 11:53

3 respostas

7

velocidade do link

Eu não acho que você esteja realmente procurando por velocidade de link, esta é a velocidade de conexão dedicada de sua conexão. Se você tem ethtool installed (em repos) você pode usar este comando para obter sua velocidade de link:

$ sudo ethtool eth0 | grep -i speed
    Speed: 100Mb/s

largura de banda (kernel)

Você deseja ver sua velocidade de largura de banda. Quanto da velocidade total você está usando em um determinado período de tempo. Existem algumas maneiras de obter os bytes lidos pela interface eth0 :

$ cat /sys/class/net/eth0/statistics/rx_bytes 
3431530366

Há também /proc/net/dev , que acredito ser a estrutura do kernel que fornece os dados para ifconfig :

$ cat /proc/net/dev
Inter-|   Receive                                                |  Transmit
 face |bytes    packets errs drop fifo frame compressed multicast|bytes    packets errs drop fifo colls carrier compressed
    lo:629956414  572909    0    0    0     0          0         0 629956414  572909    0    0    0     0       0          0
  eth0:3431888253 329701689    0    0    0     0          0    359127 831203319 353144288    0    0    0     0       0          0
  sit0:       0       0    0    0    0     0          0         0        0       0    0    0    0     0       0          0

medindo usando ferramentas

Melhor ainda seria usar uma ferramenta real para medir seu uso de largura de banda. Existem muitas opções aqui:

  1. use o wget / curl

    Estes são bastante simples. Escolha um arquivo grande para fazer o download e veja as estatísticas informadas por qualquer uma das ferramentas após a conclusão.

    $ wget --output-document=/dev/null http://speedtest.wdc01.softlayer.com/downloads/test500.zip
    
    -or-
    
    $ curl -O /dev/null http://speedtest.wdc01.softlayer.com/downloads/test500.zip
    
  2. use uma ferramenta de monitoramento de cli

    Existem inúmeras ferramentas nesta categoria. Aqui está um casal para você começar.

  3. use speedtest-cli

    Isso faz uso do venerável site speedtest.net a partir da linha de comando.

    $ ./speedtest-cli
    Retrieving speedtest.net configuration...
    Retrieving speedtest.net server list...
    Testing from Comcast Cable (x.x.x.x)...
    Selecting best server based on ping...
    Hosted by FiberCloud, Inc (Seattle, WA) [12.03 km]: 44.028 ms
    Testing download speed........................................
    Download: 32.29 Mbit/s
    Testing upload speed..................................................
    Upload: 5.18 Mbit/s
    
  4. use iperf

    Para isso, você configurará seu próprio servidor e cliente e, em seguida, avaliará o desempenho da largura de banda entre dois de seus computadores. Isso é melhor no sentido de que você obterá uma imagem mais precisa do desempenho do seu computador / rede do que dependendo do desempenho de um destino específico da Internet.

    no servidor:

    $ iperf -s
    

    no cliente:

    $ iperf -c myserver.mydom
     ------------------------------------------------------------
    Client connecting to 192.168.1.1, TCP port 5001
    TCP window size: 16.0 KByte (default)
    ------------------------------------------------------------
     [  3] local 192.168.1.3 port 52143 connected with 192.168.1.1 port 5001
     [ ID] Interval       Transfer     Bandwidth
     [  3]  0.0-10.0 sec    113 MBytes  94.7 Mbits/sec
    

Referências

por 05.08.2013 / 12:40
4

Estou realmente de acordo com suas perguntas e respostas, portanto, posso fazer isso em uma única linha:

m1='cat /sys/class/net/eth0/statistics/tx_bytes' ; sleep 10s ; m2='cat /sys/class/net/eth0/statistics/rx_bytes' ; echo $((($m2-$m1)/10240))

E imprime muito bem.

De uma maneira mais sofisticada:

#!/bin/bash                                                                          

intervalo=3                                                                          
info="/sys/class/net/"                                                               
cd $info                                                                             
for interface in eth*                                                                
do                                                                                   
  rx1='cat $info$interface/statistics/rx_bytes'                                      
  tx1='cat $info$interface/statistics/tx_bytes'                                      
 'sleep $((intervalo))s'                                                            
  rx2='cat $info$interface/statistics/rx_bytes'                                      
  tx2='cat $info$interface/statistics/tx_bytes'
  echo $interface
  echo ----
  echo RX: $((($rx2-$rx1)/($intervalo*1024))) Kbps
  echo TX: $((($tx2-$tx1)/($intervalo*1024))) Kbps
done

Isso funciona bem, mas pode ser melhorado usando arrays para salvar cada resultado da interface, portanto, seria necessário apenas fazer um repouso para todas as interfaces, e não uma por qualquer uma delas.

    
por 05.02.2015 / 05:58
0

A velocidade anunciada e a velocidade real do link podem ser diferentes

sudo ethtool enp1s0
Settings for enp1s0:
Supported ports: [ TP ]
Supported link modes:   10baseT/Half 10baseT/Full 
                        100baseT/Half 100baseT/Full 
                        1000baseT/Full 
Advertised link modes:  10baseT/Half 10baseT/Full 
                        100baseT/Half 100baseT/Full 
                        1000baseT/Full 

Isso informa a velocidade real do link negociada entre os dois dispositivos em cada extremidade do link. Meus laptops placa de rede do switch local eu me conectar.

Considerando que a velocidade real informada por essas ferramentas é

sudo mii-tool enp1s0
enp1s0: negotiated 100baseTx-FD flow-control, link ok

sudo ethtool enp1s0 | grep -i speed
Speed: 100Mb/s

Eu só alcançarei a velocidade do link quando fizer o download de algo conectado na mesma LAN na mesma velocidade.

Se eu baixar um arquivo de um servidor na mesma LAN. Eu vou conseguir os 100Mb / s completos.

Então, onde eu conto para fazer a diferença para a velocidade que eu recebo.

    
por 05.02.2018 / 14:32