Linux에서 어떤 프로세스가 내 디스크 I/O 대역폭을 사용하고 있는지 알고 싶습니다.
사용할 수 있다는 것은 알지만 여러가지 이유로 설치할 수 없는 iotop
머신이 있습니다 .iotop
이 정보를 수동으로 얻으려면 어떻게 해야 합니까? (그 iotop
자체는 어떻게 작동하나요?)
답변1
의 파일은 /proc/<pid>/io
필요한 것을 나타냅니다. 이와 유사한 출력을 얻으려면 약간의 스크립팅 작업이 필요합니다 iotop
. 보다리눅스 커널 문서/proc/<pid>/io
파일 값 으로 :
문자 유형
I/O 카운터: 읽은 문자 이 작업으로 인해 저장소에서 읽은 바이트 수입니다. 이는 단순히 프로세스가 read() 및 pread()에 전달한 바이트의 합계입니다. tty IO와 같은 것을 포함하며 실제 물리적 디스크 IO가 필요한지 여부에 영향을 받지 않습니다(페이지 캐시에서 읽기가 이미 충족되었을 수 있음).
문자 유형
I/O 카운터: 쓴 문자 이 작업으로 인해 디스크에 기록되었거나 기록되어야 했던 바이트 수입니다. rchar와 유사한 경고가 여기에 적용됩니다.
[...]
읽은 바이트 수
I/O 카운터: 바이트 읽기는 이 프로세스가 실제로 스토리지 계층에서 가져온 바이트 수를 계산하려고 시도합니다. 이는 commit_bio() 수준에서 수행되므로 블록 지원 파일 시스템에 정확합니다.
쓴 바이트 수
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
:는 포함되거나 축소될 수 있음) 목록을 비교하고 차이를 계산합니다. 지난 2초 동안 I/O가 가장 많은 10개 프로세스와 해당 I/O 대역폭을 인쇄합니다. 읽기 I/O 대신 쓰기 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)