บน Linux ฉันต้องการทราบว่ากระบวนการใดใช้ Band I ของดิสก์ I / O ของฉัน
ฉันรู้ว่าฉันสามารถใช้งานได้iotop
แต่ฉันมีเครื่องที่iotop
ไม่สามารถติดตั้งด้วยเหตุผลต่าง ๆได้
ฉันจะรับข้อมูลด้วยตนเองได้อย่างไร ( iotop
ตัวเองดำเนินการอย่างไร)
บน Linux ฉันต้องการทราบว่ากระบวนการใดใช้ Band I ของดิสก์ I / O ของฉัน
ฉันรู้ว่าฉันสามารถใช้งานได้iotop
แต่ฉันมีเครื่องที่iotop
ไม่สามารถติดตั้งด้วยเหตุผลต่าง ๆได้
ฉันจะรับข้อมูลด้วยตนเองได้อย่างไร ( iotop
ตัวเองดำเนินการอย่างไร)
คำตอบ:
ไฟล์ที่/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)