测量单个程序执行使用的带宽

测量单个程序执行使用的带宽

我想测量单个程序启动所消耗的带宽(对于从 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和列。)OutOctectsnetstat

不幸的是,/proc/$PID/net只是/proc/net,因此信息对所有进程都是通用的。阅读netstat不会提供有关特定进程的任何信息。

相关内容