tsh*_*ang 16 monitoring bandwidth
我找到了一个不错的监视器,它允许我记录单个进程的各种运行时数据。我正在寻找对带宽使用具有相同作用的等价物。理想情况下,该命令应类似于bwmon --pid 1 --log init.log. 有这样的吗?它可以在没有管理员权限的情况下运行吗?
如果您对使用的一般 I/O 带宽感到满意(或者如果您的程序几乎完全是网络 I/O),那么您可以观看该/proc/<pid>/io文件。你想要rchar和wchar字段。您可能想要减去read_bytes和write_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,只要你拥有你正在检查的进程,但是写起来真的很麻烦,更不用说写得好。
一些帮助你开始的东西(以防万一你想自己写):
#!/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)
评论:
stat --printf="%N\n" /proc/PID/exe | cut -d ' ' -f 3