Câu trả lời:
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>/io
giá 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 bash
tậ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 grep
lệnh trong danh sách thành wchar
thay 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)