知道哪个进程在没有iotop的情况下进行I/O

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将列表中的命令编辑wcharrchar

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)