2014-10-26 88 views
2

我想监视我的电脑上传和下载速度。一个名为conky的程序已经在conky conf中使用以下内容:python获取上传/下载速度

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

它在我浏览时显示几乎实时的速度。我希望能够使用python访问相同的信息。

+0

你想如何使用这些信息?您可以从命令行执行几项操作并将其传送到您的程序中。但是这可能不是你想要的行为,例如你可以使用'nload -m wlan0 | do_stuff.py' – Leon 2014-11-10 20:05:33

+0

@Leon nload看起来非常好。我希望我的python脚本每秒跟踪dl/ul速度并记录下来,以便稍后绘制它。知道哪个程序使用该带宽也是非常有帮助的,但到目前为止我还没有看到任何可以做到的事情。 – yayu 2014-11-10 21:46:51

+1

'nethogs'会为你做到这一点 – Leon 2014-11-11 07:05:05

回答

11

可以计算基于在时间间隔

这里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

4

我想看看Python的psutil module

这里是它打印出来,因为你发送的字节数的一小段启动您的计算机:

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

您可以轻松地扩展这个抢在恒定的区间值,并diff的两个值来确定在该段时间内发送和/或接收的字节数。

1

你可以做什么狡猾如呼叫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} 
2

为了具有接口特定的统计信息已经提出的方法可以很好地工作。

我会尽力,而不是提出一个解决方案,您的第二个请求:

这也将是非常有益知道使用哪些程序 带宽,但到目前为止,我还没有看到任何东西,可以做到这一点。

如已经暗示,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] 

在这里,我们只有一个插座,177472是inode号码。我们会在这里找到所有类型的套接字:TCPv4,TCPv6,UDP,netlink。在这种情况下,我将只考虑TCPv4。

一旦收集到所有的inode号码,每个套接字将被分配一个唯一的标识符,即(IP_SRC, PORT_SRC, IP_DEST, PORT_DEST)。当然,与PID的配对也是存储的。可以从/proc/net/tcp(用于TCPv4)检索元组(IP_SRC, PORT_SRC, IP_DEST, PORT_DEST)。在这种情况下:

➜ ~ [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,我的脚本无法跟上网络流量。

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