有没有可以监控单个进程带宽使用情况的工具?

tsh*_*ang 16 monitoring bandwidth

我找到了一个不错的监视器,它允许我记录单个进程的各种运行时数据。我正在寻找对带宽使用具有相同作用的等价物。理想情况下,该命令应类似于bwmon --pid 1 --log init.log. 有这样的吗?它可以在没有管理员权限的情况下运行吗?

Jan*_*der 6

如果您对使用的一般 I/O 带宽感到满意(或者如果您的程序几乎完全是网络 I/O),那么您可以观看该/proc/<pid>/io文件。你想要rcharwchar字段。您可能想要减去read_byteswrite_bytes,因为它们代表对存储层的读取和写入。请参阅http://www.kernel.org/doc/Documentation/filesystems/proc.txt 的第 3.3 节。

如果您需要更多分辨率.... 您可以使用lsofand编写此脚本strace,尽管让所有极端情况都正确是很痛苦的。其基本思想是解析的输出strace -p <pid>,抓住了第一个参数(=文件描述符)和返回值(=字节数)read()write()send(),和recv()电话(注:有几个系统调用来监听,我的天堂” t 都追踪到了它们)。丢弃负值;它们表示错误。使用lsof -p <pid>找出哪些文件描述符是TCP / UDP套接字,每FD加起来计数。这个策略不需要root,只要你拥有你正在检查的进程,但是写起来真的很麻烦,更不用说写得好。


aki*_*ira 1

一些帮助你开始的东西(以防万一你想自己写):

#!/bin/bash
#
# usage: bwmon PID

IN=0; OUT=0; TIME=0

get_traffic() {
    t=`awk '/eth0:/ { printf("%s,%d,%d\n",strftime("%s"),$2,$10); }' < /proc/$1/net/dev`
    IN=${t#*,}; IN=${IN%,*}
    OUT=${t##*,};
    TIME=${t%%,*};
}

get_traffic $1
while true
do
    _IN=$IN; _OUT=$OUT; _TIME=$TIME
    get_traffic $1
    echo "$TIME,$(( $TIME - $_TIME )),$IN,$(( $IN - $_IN )),$OUT,$(( $OUT - $_OUT))"
    sleep 1
done
Run Code Online (Sandbox Code Playgroud)

评论:

  • 仅检查 eth0
  • 每 1 秒检查一次
  • 仅在 linux 下工作,但其他 unix 工作类似(procfs 或其他)
  • 输出可以存储到 sqlite.db 中stat --printf="%N\n" /proc/PID/exe | cut -d ' ' -f 3

  • 我不认为这实际上是每个进程的计数器;我认为这只是从进程的角度来看的总接口数。我在本地主机上运行了客户端/服务器“nc”对,每秒发送一个字节,并观看了“/proc/&lt;listening-nc-pid&gt;/net/dev”。然后我运行了第二个“nc”对,以最大速率发送。我正在观看的文件非常明显地计算了第二对的数据和第一对的数据。在 Linux 2.6.32 上运行。 (15认同)
  • @Jander这是正确的,`/proc/&lt;pid&gt;/net/dev`和`/proc/net/dev`在这里有相同的内容。因此,scipt 仅报告 eth0 的流量,而不报告给定进程的流量。 (4认同)
  • 确认这不是答案。它测量“eth0”的接口计数器,如进程所见。它*不*计算进程通过该接口发送的数据。 (2认同)