Answers:
中的文件/proc/<pid>/io
代表您的需求。获得类似于的输出需要一些脚本工作iotop
。请参阅linux内核文档中的/proc/<pid>/io
文件值:
查尔
I / O计数器:chars read导致此任务从存储中读取的字节数。这只是该过程传递给read()和pread()的字节总和。它包含诸如tty IO之类的内容,并且不受是否需要实际的物理磁盘IO的影响(读取可能已从pagecache满足)
wchar
I / O计数器:已写入字符此任务已导致或应导致将其写入磁盘的字节数。与rchar相似的警告也适用于此。
[...]
read_bytes
I / O计数器:读取的字节数尝试计算此过程确实确实导致从存储层获取的字节数。在commit_bio()级别完成,因此对于块支持的文件系统来说是准确的。
write_bytes
I / O计数器:已写入的字节尝试计算此过程导致发送到存储层的字节数。这是在弄脏页面时完成的。
现在,您可以使用该小bash
脚本:
#!/bin/bash
if [ "$(id -u)" -ne 0 ] ; then
echo "Must be root" 2>&1
exit 1
fi
delay=2
lista=$(for p in $(pgrep "."); do echo -n "$p "; grep ^rchar /proc/$p/io 2>/dev/null; done)
while :; do
echo "-----"
listb=$(for p in $(pgrep "."); do echo -n "$p "; grep ^rchar /proc/$p/io 2>/dev/null; done)
echo "$lista" | while read -r pida xa bytesa; do
[ -e "/proc/$pida" ] || continue
echo -en "$pida:\t"
bytesb=$(echo "$listb" | awk -v pid=$pida '$1==pid{print $3}')
echo "$((($bytesb - $bytesa) / $delay)) b/s"
done | sort -nk2 | tail
sleep $delay
listb=$lista
done
它创建两个列表,两个列表之间的延迟为2秒($delay
:可以减少或减少),然后比较列表并计算差异。I / O最多的10个过程将在最近2秒钟内打印其I / O带宽。如果要写I / O而不是读I / O,只需grep
将列表中的命令编辑为,wchar
而不是rchar
:
lista=$(for p in $(pgrep "."); do echo -n "$p "; grep ^wchar /proc/$p/io 2>/dev/null; done)
listb=$(for p in $(pgrep "."); do echo -n "$p "; grep ^wchar /proc/$p/io 2>/dev/null; done)