知道没有iotop的I / O是哪个进程


12

在Linux上,我想知道哪个进程使用了​​磁盘I / O带宽。

我知道我可以使用,iotop但是由于各种原因,我有一台机器iotop无法安装。

如何手动获取该信息?(iotop本身如何进行?)

Answers:


15

中的文件/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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.