Linux

知道哪個程序在沒有 iotop 的情況下進行 I/O

  • May 29, 2015

在 Linux 上,我想知道哪個程序使用了我的磁碟 I/O 頻寬。

我知道我可以使用iotop,但我有一台機器,由於各種原因,iotop無法安裝。

如何手動獲取該資訊?(它iotop本身是如何進行的?)

中的文件/proc/<pid>/io代表您需要的內容。獲得類似於iotop. 請參閱linux 核心文件中的/proc/<pid>/io文件值:

rchar

I/O 計數器:chars read 此任務已導致從儲存中讀取的字節數。這只是該程序傳遞給 read() 和 pread() 的字節總和。它包括諸如 tty IO 之類的東西,並且不受是否需要實際的物理磁碟 IO 的影響(可能已經從頁面記憶體中滿足了讀取)

wchar

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

它創建兩個列表,它們之間有 2 秒的延遲($delay: 可以在或減少),然後比較列表併計算差異。具有最多 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)

引用自:https://unix.stackexchange.com/questions/206252