我想在计算机上监控上传和下载速度。一个名为conky的程序已经在conky conf中执行了以下操作:
Connection quality: $alignr ${wireless_link_qual_perc wlan0}%
${downspeedgraph wlan0}
DLS:${downspeed wlan0} kb/s $alignr total: ${totaldown wlan0}
它在我浏览时几乎实时显示了我的速度。我希望能够使用python访问相同的信息。
答案 0 :(得分: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
执行此操作后,我发现了一个bash示例,它几乎完全相同: http://xmodulo.com/measure-packets-per-second-throughput-high-speed-network-interface.html
答案 1 :(得分:5)
我会查看Python的psutil module。
这是一个简短的代码段,用于打印自您启动计算机以来发送的字节数:
import psutil
iostat = psutil.net_io_counters(pernic=False)
print iostat[0] #upload only
您可以轻松地将其展开以按固定间隔获取值,并将两个值区分开以确定在该段时间内发送和/或接收的字节数。
答案 2 :(得分:2)
为了获得特定于接口的统计信息,已经提出的方法可以正常工作。
我会尝试为您的第二个请求建议解决方案:
知道哪个程序正在使用它也会非常有帮助 带宽,但到目前为止,我还没有看到任何可以做到这一点。
如上所述, nethogs 打印特定于流程的统计信息。据我所知,/proc
下没有 easy 方式来访问这些值,因此我将解释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的配对。可以检索元组(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计数器。通过捕获每个数据包更新的字节数,可以轻松计算每个进程的传输速度。
理论上,这可以在python中使用pypcap实现,即使它需要一些工作。我试图实现一些东西,但它的速度很慢,需要更多的工作才能使用。我只监控一个PID,只有一个连接,没有更新连接表,但超过3MB / s我的脚本无法跟上网络流量。
正如你所看到的,它并非完全无足轻重。解析已有工具的输出可能会带来更好的解决方案,并可能为您节省大量工作。
答案 3 :(得分: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}