4

パソコンでアップロードとダウンロードの速度を監視したい。conky と呼ばれるプログラムは、conky conf で次のように既に実行しています。

Connection quality: $alignr ${wireless_link_qual_perc wlan0}%
${downspeedgraph wlan0}
DLS:${downspeed wlan0} kb/s $alignr total: ${totaldown wlan0}

ブラウジング中にほぼリアルタイムで速度が表示されます。Pythonを使用して同じ情報にアクセスできるようにしたい。

4

4 に答える 4

13

デバイスの rx_bytes と tx_bytes に基づいて自分で速度を計算し、それらの値を一定間隔でポーリングすることができます

これは、Python 3を使用して一緒にハッキングした非常に単純なソリューションです

#!/usr/bin/python3

import time

def get_bytes(t, iface='wlan0'):
    with open('/sys/class/net/' + iface + '/statistics/' + t + '_bytes', 'r') as f:
        data = f.read();
    return int(data)

if __name__ == '__main__':
    (tx_prev, rx_prev) = (0, 0)

    while(True):
        tx = get_bytes('tx')
        rx = get_bytes('rx')

        if tx_prev > 0:
            tx_speed = tx - tx_prev
            print('TX: ', tx_speed, 'bps')

        if rx_prev > 0:
            rx_speed = rx - rx_prev
            print('RX: ', rx_speed, 'bps')

        time.sleep(1)

        tx_prev = tx
        rx_prev = rx
于 2014-11-10T21:13:50.597 に答える
5

Pythonのpsutil モジュールを調べます。

以下は、マシンを起動してから送信されたバイト数を出力する短いスニペットです。

import psutil
iostat = psutil.net_io_counters(pernic=False)
print iostat[0] #upload only

これを簡単に拡張して、一定の間隔で値を取得し、2 つの値を比較して、その期間に送受信されたバイト数を特定できます。

于 2014-11-12T01:59:10.273 に答える
2

インターフェイス固有の統計を取得するには、既に提案されている方法がうまく機能します。

代わりに、2 番目のリクエストの解決策を提案します。

また、どのプログラムがその帯域幅を使用していたかを知ることも非常に役立ちますが、これまでのところ、それを行うことができるものは見たことがありません.

すでに示唆されているように、nethogsはプロセス固有の統計情報を出力します。私の知る限りでは、これらの値に簡単/procにアクセスする方法はありません。

pid PID を持つ 1 つのプロセスを考えると、nethogs は最初にプロセスによって開かれたすべてのソケットのリストを取得し、/proc/PID/fd の内容をリストします。

➜  ~ [1] at 23:59:31 [Sat 15] $ ls -la /proc/21841/fd
total 0
dr-x------ 2 marco marco  0 Nov 15 23:41 .
dr-xr-xr-x 8 marco marco  0 Nov 15 23:41 ..
lrwx------ 1 marco marco 64 Nov 15 23:42 0 -> /dev/pts/15
l-wx------ 1 marco marco 64 Nov 15 23:42 1 -> /dev/null
lrwx------ 1 marco marco 64 Nov 15 23:41 2 -> /dev/pts/15
lrwx------ 1 marco marco 64 Nov 15 23:42 4 -> socket:[177472]

ここではソケットが 1 つだけあり、177472 が inode 番号です。ここには、TCPv4、TCPv6、UDP、netlink など、あらゆる種類のソケットがあります。この場合、TCPv4 のみを検討します。

すべての inode 番号が収集されると、各ソケットに一意の識別子、つまり が割り当てられます(IP_SRC, PORT_SRC, IP_DEST, PORT_DEST)。もちろん、PID とのペアリングも保存されます。タプル(IP_SRC, PORT_SRC, IP_DEST, PORT_DEST)は読み取りで取得できます/proc/net/tcp(TCPv4 の場合)。この場合:

➜  ~ [1] at 0:06:05 [Sun 16] $ cat /proc/net/tcp | grep 177472
  sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode
  38: 1D00A8C0:1F90 0400A8C0:A093 01 00000000:00000000 00:00000000 00000000  1000        0 177472 1 f6fae080 21 4 0 10 5 

アドレスは IP:PORT として表され、IP は 4 バイトの LE 番号として表されます。key->value次に、キーが(IP_SRC, PORT_SRC, IP_DEST, PORT_DEST)PID で値が PIDである構造を構築できます。

この時点で、nethogs は libpcap を使用してすべてのネットワーク トラフィックをキャプチャします。(IP_SRC_PACKET, PORT_SRC_PACKET, IP_DEST_PACKET, PORT_DEST_PACKET)TCP パケットを検出すると、テーブル内のすべての接続に対してタプルを照合しようとします。もちろん、SRC と DEST の交換を試みる必要があります。パケットは着信 (DL) または発信 (UL) の可能性があります。接続を照合すると、接続が属するプロセスの PID を取得し、TCP ペイロードのサイズを TX または RX カウンターに追加します。パケットをキャプチャするたびにバイト数が更新されるため、各プロセスの転送速度を簡単に計算できます。

これは、多少の作業が必要ですが、理論的には pypcap を使用して Python で実装できます。私は何かを実装しようとしましたが、非常に遅く、使用できるようにするにはさらに多くの作業が必要です。接続テーブルを更新せずに、1 つの接続で 1 つの PID だけを監視していましたが、3MB/s を超えると、スクリプトがネットワーク トラフィックに対応できなくなりました。

ご覧のとおり、それほど簡単ではありません。既に利用可能なツールの出力を解析すると、より良い解決策につながり、多くの作業を節約できる可能性があります。

于 2014-11-15T23:54:59.533 に答える
1

call のような危険なことをしてconky -i 1、出力を解析できます。

import subprocess
conky=subprocess.check_output("conky -i 1", shell=True)
lines=conky.splitlines()
print lines[11].split()[1::3]

その結果:

['1234B', '5678B']

私の設定は次のようになります:

${scroll 16 $nodename - $sysname $kernel on $machine | }
Uptime: $uptime
Frequency (in MHz): $freq
Frequency (in GHz): $freq_g
RAM Usage: $mem/$memmax - $memperc% ${membar 4}
Swap Usage: $swap/$swapmax - $swapperc% ${swapbar 4}
CPU Usage: $cpu% ${cpubar 4}
Processes: $processes  Running: $running_processes
File systems:
 / ${fs_used /}/${fs_size /} ${fs_bar 6 /}
Networking:
Up: ${upspeed eth0}  - Down: ${downspeed eth0}
Name              PID   CPU%   MEM%
 ${top name 1} ${top pid 1} ${top cpu 1} ${top mem 1}
 ${top name 2} ${top pid 2} ${top cpu 2} ${top mem 2}
 ${top name 3} ${top pid 3} ${top cpu 3} ${top mem 3}
 ${top name 4} ${top pid 4} ${top cpu 4} ${top mem 4}
于 2014-11-13T01:54:18.913 に答える