iotop은 어떤 프로세스가 I/O를 수행하는지 알 필요가 없습니다.

iotop은 어떤 프로세스가 I/O를 수행하는지 알 필요가 없습니다.

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)

관련 정보