Biết quá trình nào I / O không có iotop


12

Trên Linux, tôi muốn biết quá trình nào sử dụng băng thông I / O đĩa của tôi.

Tôi biết tôi có thể sử dụng iotopnhưng tôi có một máy trong đó, vì nhiều lý do, iotopkhông thể cài đặt được.

Làm thế nào tôi có thể tự lấy thông tin đó? (Làm thế nào để iotopchính nó tiến hành?)

Câu trả lời:


16

Các tập tin /proc/<pid>/iođại diện cho những gì bạn cần. Đó là một công việc kịch bản bit để có được một đầu ra tương tự iotop. Xem tài liệu kernel linux với các /proc/<pid>/iogiá trị tệp:

than chì

Bộ đếm I / O: chars read Số byte mà tác vụ này đã gây ra được đọc từ bộ lưu trữ. Đây chỉ đơn giản là tổng số byte mà quá trình này chuyển qua read () và pread (). Nó bao gồm những thứ như tty IO và nó không bị ảnh hưởng bởi có yêu cầu IO đĩa vật lý thực tế hay không (việc đọc có thể đã được thỏa mãn từ pagecache)

war

Bộ đếm I / O: ký tự được viết Số byte mà tác vụ này đã gây ra hoặc sẽ được ghi vào đĩa. Hãy cẩn thận tương tự áp dụng ở đây như với rchar.

[...]

đọc_byte

Bộ đếm I / O: byte đọc Cố gắng đếm số byte mà quá trình này thực sự gây ra để được tìm nạp từ lớp lưu trữ. Thực hiện ở cấp submit_bio (), vì vậy nó chính xác cho các hệ thống tệp được hỗ trợ khối.

write_byte

Bộ đếm I / O: byte được viết Cố gắng đếm số byte mà quá trình này gây ra được gửi đến lớp lưu trữ. Điều này được thực hiện tại thời điểm bẩn trang.

Bây giờ, bạn có thể sử dụng bashtập lệnh nhỏ đó :

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

Nó tạo ra hai danh sách với độ trễ là 2 giây ( $delay: có thể giảm hoặc giảm) giữa chúng và sau đó so sánh các danh sách và tính toán sự khác biệt. Quá trình 10 với nhiều I / O nhất được in với băng thông I / O của họ trong 2 giây qua. Nếu bạn muốn viết I / O thay vì đọc I / O, chỉ cần chỉnh sửa greplệnh trong danh sách thành wcharthay vì 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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.