ทราบว่ากระบวนการใดที่ I / O ไม่มี iotop


12

บน Linux ฉันต้องการทราบว่ากระบวนการใดใช้ Band I ของดิสก์ I / O ของฉัน

ฉันรู้ว่าฉันสามารถใช้งานได้iotopแต่ฉันมีเครื่องที่iotopไม่สามารถติดตั้งด้วยเหตุผลต่าง ๆได้

ฉันจะรับข้อมูลด้วยตนเองได้อย่างไร ( iotopตัวเองดำเนินการอย่างไร)

คำตอบ:


15

ไฟล์ที่/proc/<pid>/ioแสดงถึงสิ่งที่คุณต้องการ iotopมันเป็นงานบิตสคริปต์จะได้รับการส่งออกไปยังที่คล้ายกัน ดูเอกสารประกอบเคอร์เนล linuxกับ/proc/<pid>/ioค่าไฟล์:

rchar

I / O ตัวนับ: chars read จำนวนไบต์ที่งานนี้ทำให้อ่านจากหน่วยเก็บ นี่เป็นผลรวมของไบต์ที่กระบวนการนี้ส่งผ่านไปยัง read () และ pread () มันรวมถึงสิ่งต่าง ๆ เช่น tty IO และไม่ได้รับผลกระทบจากหรือไม่ต้องใช้ฟิสิคัลดิสก์จริง IO (การอ่านอาจพอใจจาก pagecache)

WCHAR

ตัวนับ I / O: ตัวอักษรที่เขียนจำนวนไบต์ที่งานนี้ก่อให้เกิดหรือจะทำให้เขียนลงดิสก์ คำเตือนที่คล้ายกันมีผลกับที่นี่เช่นเดียวกับ rchar

[ ... ]

read_bytes

ตัวนับ I / O: ไบต์อ่านพยายามนับจำนวนไบต์ซึ่งกระบวนการนี้ทำให้เกิดการดึงข้อมูลจากเลเยอร์การจัดเก็บจริง ๆ ทำที่ระดับ submit_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: สามารถเป็น - หรือลดลง) ระหว่างพวกเขาแล้วเปรียบเทียบรายการและคำนวณความแตกต่าง กระบวนการ 10 รายการที่มี I / O ส่วนใหญ่จะพิมพ์ด้วย I / O แบนด์ที่มีใน 2 วินาทีที่ผ่านมา หากคุณต้องการเขียน I / O แทน read 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)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.