我想测量单个程序启动所消耗的带宽(对于从 cron 启动的进程,以便了解它们使用了多少带宽)。我知道 nethogs 和许多其他测量每个设备/端口带宽的命令。
理想情况下,它应该是类似于 trickle 的东西,它被添加到命令前面,并在最终确定时报告使用的数据。我的研究没有结果。
我唯一的替代想法是使用 ifconfig 获取启动前和完成之后传输的字节数,但这显然非常粗糙。有什么更好的想法吗?
我想如果有足够的时间进行编码的话,trickle 可以作为此类程序的更简单的起点...
答案1
nethogs
做这个:http://nethogs.sourceforge.net/,使用软件中心进行安装。
我相信它sysdig
也可以使用,但我手头没有语法。
答案2
我能想到的一种传输数据的方法是使用 iptables,同时在某些独特的可匹配条件下运行程序,例如单独的组。
首先,选择一个您所属的组,并且该组下没有运行任何进程:
$ for i in $(groups); do echo $i $(pgrep -c -G $i); done | awk '$2 == 0'
cdrom 0
sudo 0
plugdev 0
lpadmin 0
sambashare 0
debian-tor 0
libvirtd 0
我将选择debian-tor
。现在添加一个 iptables 规则,该规则将匹配来自此组中进程的流量。这将需要 root 访问权限,因此将以下内容添加sudo
到所有iptables
命令中:
iptables -N STATS # Create a new chain
iptables -A STATS -p tcp -j RETURN # And let it do nothing
iptables -A OUTPUT -p tcp -m owner --gid-owner debian-tor -j STATS
启动您的申请:
sg debian-tor 'ssh a.friendly.system "cat - >/dev/null" </dev/zero'
检查统计数据:
$ iptables -vL STATS
Chain STATS (1 references)
pkts bytes target prot opt in out source destination
148K 393M ACCEPT tcp -- any any anywhere anywhere
这对于接收的数据不起作用。:(
另一种方法可能是使用/proc/$PID/netstat
,如果你能让你的应用程序保持足够长的时间:
$ awk '{for (i=1; i<=NF; i++) {($i~/(In|Out)Octets/) && a[i] = 1}; z=""; for (i=1; i<=NF; i++){(a[i] == 1) && z = z " " $i}; if (z) {print z}}' /proc/12307/net/netstat
InOctets OutOctets
254543569761 2144044764834
(所有代码都用于在文件中awk
查找InOctects
和列。)OutOctects
netstat
不幸的是,/proc/$PID/net
只是/proc/net
,因此信息对所有进程都是通用的。阅读netstat
不会提供有关特定进程的任何信息。