IOTOP없이 어떤 프로세스가 I / O를 수행하는지 파악


12

Linux에서는 디스크 I / O 대역을 사용하는 프로세스를 알고 싶습니다.

사용할 수는 iotop있지만 여러 가지 이유로 iotop설치할 수없는 기계가 있습니다.

해당 정보를 수동으로 얻으려면 어떻게해야합니까? (어떻게 iotop진행됩니까?)

답변:


15

파일은 /proc/<pid>/io필요한 것을 나타냅니다. 와 비슷한 출력을 얻는 것은 약간의 스크립팅 작업 iotop입니다. 파일 값에 대한 리눅스 커널 문서 를 참조하십시오 /proc/<pid>/io:

챠르

I / O 카운터 : 문자 읽기이 작업으로 인해 저장소에서 읽은 바이트 수입니다. 이것은 단순히이 프로세스가 read () 및 pread ()에 전달한 바이트의 합계입니다. 여기에는 tty IO와 같은 것이 포함되며 실제 물리 디스크 IO가 필요한지 여부에 영향을받지 않습니다 (읽기가 pagecache에서 만족되었을 수 있음).

char

I / O 카운터 : chars written이 작업으로 인해 발생하거나 디스크에 기록되는 바이트 수입니다. 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: 감소 또는 감소 가능), 목록을 비교하고 차이를 계산합니다. I / O가 가장 많은 10 개의 프로세스는 마지막 2 초 동안 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)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.