无需 iotop 即可了解哪个进程进行 I/O

无需 iotop 即可了解哪个进程进行 I/O

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

相关内容