web-dev-qa-db-ja.com

リンク速度を決定するためにifconfig出力をどのように処理しますか?

ダウンロード速度のテストのために、私が退屈に書いたスクリプトは次のとおりです。

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

それが「仕事をしている」かどうかはわかりませんが、私は本当のベーシストではありません:p
ifconfigはRXバイトを生成するので、それを1000で割ってkB/sを取得します

5
moe

リンク速度

私はあなたが本当にリンク速度を探しているとは思いません、これはあなたの接続の専用接続速度です。 ethtoolがインストールされている場合(リポジトリ内)、次のコマンドを使用してリンク速度を取得できます。

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

帯域幅(カーネル)

帯域幅の速度を確認したい。所定の時間内に使用している合計速度の割合。 eth0インターフェースがバイトを読み取る方法はいくつかあります。

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

/proc/net/devもあり、これは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

ツールを使用した測定

帯域幅の使用状況を測定するために実際のツールを使用することをお勧めします。ここには多くのオプションがあります:

  1. wget/curlを使用

    これらは非常に簡単です。大きなファイルを選択してダウンロードし、完了後にどちらかのツールから報告される統計を確認します。

    $ 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. cLI監視ツールを使用する

    このカテゴリには多数のツールがあります。ここにあなたを始めるためのカップルがあります。

  3. speedtest-cli を使用します

    これはコマンドラインから由緒ある speedtest.net Webサイトを利用します。

    $ ./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. iperf を使用します

    このために、独自のサーバーとクライアントをセットアップし、2台のコンピューター間の帯域幅パフォーマンスを測定します。これは、特定のインターネットターゲットのパフォーマンスに依存するよりも、コンピュータ/ネットワークパフォーマンスのより正確な状況を把握できるという意味で優れています。

    サーバー上:

    $ iperf -s
    

    クライアント上:

    $ 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
    

参考文献

8
slm

私はあなたの質問と回答に本当に同意しているので、これを実際に1行で行うことができます。

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

そしてそれはかなりよく印刷されます。

より洗練された方法で:

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

これは問題なく機能しますが、配列を使用して各インターフェイスの結果を保存することで改善できるため、すべてのインターフェイスに対してスリープを実行するだけでよく、いずれか1つではスリープを実行する必要はありません。

3
chas

アドバタイズされた速度とリンクの実際の速度は異なる場合があります

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 

これは、リンクの両端にある両方のデバイス間でネゴシエートされた実際のリンク速度を報告します。私のラップトップのネットワークカードは、接続するローカルスイッチです。

これらのツールによって報告される実際の速度は

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

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

同じLANに接続されているものを同じ速度でダウンロードした場合にのみ、リンク速度に到達します。

同じLAN上のサーバーからファイルをダウンロードした場合。完全な100Mb/sを取得します。

だから私が接続する場所は私が得る速度に違いを生むでしょう。

1
nelaaro