在 Linux 上,我想知道哪个进程使用我的磁盘 I/O 带宽。
我知道我可以使用,iotop
但我有一台机器,由于各种原因iotop
无法安装。
我如何手动获取该信息? (它本身如何iotop
进行?)
答案1
中的文件/proc/<pid>/io
代表您需要的内容。获得类似于 的输出需要一些脚本工作iotop
。请参阅Linux内核文档到/proc/<pid>/io
文件值:
字符型
I/O 计数器:读取的字符数 该任务导致从存储中读取的字节数。这只是该进程传递给 read() 和 pread() 的字节总和。它包括诸如 tty IO 之类的内容,并且不受是否需要实际物理磁盘 IO 的影响(读取可能已从页面缓存得到满足)
字符型
I/O 计数器:写入的字符数 该任务已导致或应导致写入磁盘的字节数。与 rchar 类似的警告也适用于此。
[...]
读取字节数
I/O 计数器:读取的字节数 尝试计算此过程实际导致从存储层获取的字节数。在 commit_bio() 级别完成,因此对于块支持的文件系统来说它是准确的。
写字节数
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
:可以是 in- 或减少),然后比较列表并计算差异。打印 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)