Tot*_*tor 12 linux scripting io shell-script proc
在 Linux 上,我想知道哪个进程使用我的磁盘 I/O 带宽。
我知道我可以使用,iotop但我有一台由于各种原因iotop无法安装的机器。
如何手动获取该信息?(它iotop本身是如何进行的?)
cha*_*aos 15
中的文件/proc/<pid>/io代表您需要的内容。获得类似于iotop. 见Linux内核文件到/proc/<pid>/io文件的值:
字符
I/O 计数器:读取的字符数 此任务导致从存储中读取的字节数。这只是此进程传递给 read() 和 pread() 的字节总和。它包括 tty IO 之类的东西,并且不受是否需要实际物理磁盘 IO 的影响(读取可能已从页面缓存中得到满足)
字符
I/O 计数器:写入的字符数 此任务已导致或将导致写入磁盘的字节数。与 rchar 类似的警告在这里也适用。
[...]
读取字节数
I/O 计数器:读取的字节数 尝试计算此进程确实导致从存储层获取的字节数。在 submit_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
Run Code Online (Sandbox Code Playgroud)
它创建两个列表,$delay它们之间有 2 秒的延迟(: 可以在-或减少),然后比较列表并计算差异。具有最多 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)
Run Code Online (Sandbox Code Playgroud)