Ketahui proses mana yang dilakukan I / O tanpa iotop

12

Di Linux, saya ingin tahu proses mana yang menggunakan bandwidth I / O disk saya.

Saya tahu saya dapat menggunakan iotoptetapi saya memiliki mesin di mana, karena berbagai alasan, iotoptidak dapat diinstal.

Bagaimana saya bisa mendapatkan informasi itu secara manual? (Bagaimana prosesnya iotopsendiri?)

Totor
sumber

Jawaban:

15

File dalam /proc/<pid>/iomewakili apa yang Anda butuhkan. Ini adalah pekerjaan scripting yang sedikit untuk mendapatkan hasil yang serupa iotop. Lihat dokumentasi kernel linux untuk nilai /proc/<pid>/iofile:

rchar

Penghitung I / O: karakter membaca Jumlah byte yang tugas ini menyebabkan harus dibaca dari penyimpanan. Ini hanyalah jumlah byte yang proses ini dilewati untuk membaca () dan pread (). Ini termasuk hal-hal seperti tty IO dan tidak terpengaruh oleh apakah IO disk fisik yang sebenarnya diperlukan atau tidak (bacaan mungkin telah dipenuhi dari pagecache)

wchar

Penghitung I / O: karakter yang ditulis Jumlah byte yang disebabkan oleh tugas ini, atau akan menyebabkan ditulis ke disk. Peringatan serupa berlaku di sini seperti dengan rchar.

[...]

read_bytes

Penghitung I / O: byte membaca Mencoba untuk menghitung jumlah byte yang benar-benar menyebabkan proses ini diambil dari lapisan penyimpanan. Dilakukan pada tingkat submit_bio (), sehingga akurat untuk sistem file yang didukung blok.

write_bytes

Penghitung I / O: byte yang ditulis Coba untuk menghitung jumlah byte yang menyebabkan proses ini dikirim ke lapisan penyimpanan. Ini dilakukan pada saat halaman-kotor.

Sekarang, Anda dapat menggunakan bashskrip kecil itu :

#!/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

Itu membuat dua daftar dengan penundaan 2 detik ( $delay: bisa di- atau dikurangi) di antara mereka, dan kemudian membandingkan daftar dan menghitung perbedaan. 10 proses dengan I / O terbanyak dicetak dengan bandwidth I / O mereka dalam 2 detik terakhir. Jika Anda ingin menulis I / O alih-alih membaca I / O, cukup edit grepperintah di daftar wcharbukan 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)
kekacauan
sumber