python获取上传/下载速度

我想监视我的电脑上传和下载速度。 一个名叫conky的程序已经在conky conf中做了以下的工作:

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

当我浏览时,它几乎可以实时显示我的速度。 我想能够使用python访问相同的信息。

Solutions Collecting From Web of "python获取上传/下载速度"

您可以根据设备的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 

这样做后,我发现一个bash的例子,几乎相同: http : //xmodulo.com/measure-packets-per-second-throughput-high-speed-network-interface.html

我会研究Python的psutil模块 。

下面是一个简短的代码片断,它显示了自引导机器以来发送的字节数:

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

您可以很容易地扩展这个以固定的时间间隔获取数值,然后区分这两个数值来确定在这段时间内发送和/或接收的字节数。

为了具有接口特定的统计数据,已经提出的方法将工作得很好。

我会试着建议你的第二个请求的解决方案:

知道哪个程序使用这个带宽也是非常有帮助的,但到目前为止我还没有看到任何可以做到的事情。

如前所述, nethogs打印进程特定的统计信息。 据我所知,在/proc下访问这些值是不容易的 ,因此我将解释nethogs是如何实现这个功能的。

考虑一个使用pid PID的进程,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] 

这里我们只有一个socket,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。

在这一点上,nethogs使用libpcap捕获所有的网络流量。 当它检测到一个TCP包时,它会尝试将元组(IP_SRC_PACKET, PORT_SRC_PACKET, IP_DEST_PACKET, PORT_DEST_PACKET)与表内的所有连接进行匹配。 当然,它必须尝试交换SRC和DEST,数据包可以是传入(DL)或传出(UL)。 如果连接成功,则检索连接所属进程的PID,并将TCP有效负载的大小添加到TX或RX计数器。 通过捕获每个数据包更新的字节数,可以轻松计算每个进程的传输速度。

理论上讲,这可以通过pypcap实现,尽管它需要一些工作。 我试图实现一些东西,但是这个过程非常缓慢,需要更多的工作才能使用。 我只监视一个PID,一个连接,不更新连接表,但超过3MB / s我的脚本无法跟上网络流量。

正如你所看到的,这并不是微不足道的。 解析已有工具的输出可能会导致更好的解决方案,并可能为您节省大量工作。

你可以做一些事情,比如调用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}