我找到了一个不错的显示器它允许我记录单个进程的各种运行时数据。我正在寻找一种对带宽使用具有相同作用的等效方法。理想情况下,该命令应类似于bwmon --pid 1 --log init.log
.有这样的吗?没有管理员权限可以运行吗?
答案1
如果您对使用的一般 I/O 带宽感到满意(或者如果您的程序几乎完全执行网络 I/O),那么您可以观看该/proc/<pid>/io
文件。您想要rchar
和wchar
字段。您可能需要减去read_bytes
和write_bytes
,因为它们代表对存储层的读取和写入。参见第 3.3 节http://www.kernel.org/doc/Documentation/filesystems/proc.txt。
如果您需要更多解决方案......您可以使用lsof
和编写此脚本strace
,尽管要正确处理所有极端情况会很痛苦。基本思想是解析 的输出strace -p <pid>
,从read()
、write()
、send()
和recv()
调用 (笔记还有几个系统调用需要监听;我还没有全部追踪到)。丢弃负值;它们指示错误。用于lsof -p <pid>
找出哪些文件描述符是 TCP/UDP 套接字,并将每个 fd 的计数相加。只要您拥有正在检查的进程,此策略就不需要 root,但写起来确实很麻烦,更不用说写得好了。
答案2
尝试网络猪:
NetHogs 是一个小型“网顶”工具。它不像大多数工具那样按协议或每个子网分解流量,而是按进程对带宽进行分组。 NetHogs 不依赖于特殊的内核模块来加载。如果突然出现大量网络流量,您可以启动 NetHogs 并立即查看哪个 PID 导致了这种情况。这样可以轻松识别那些疯狂运行并突然占用您带宽的程序。
答案3
一些帮助你开始的东西(以防万一你想自己写):
#!/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
评论:
- 仅检查 eth0
- 每 1 秒检查一次
- 仅在 linux 下工作,但其他 unix 工作类似(procfs 或其他)
- 输出可以存储到 sqlite.db 中
stat --printf="%N\n" /proc/PID/exe | cut -d ' ' -f 3