높은 I / O를 담당하는 특정 파일 결정


37

이것은 간단한 문제이지만 실제로 실제로 고쳐야했던 것은 가장 많은 I / O의 대상이되는 특정 파일 / 아이 노드를 찾는 것입니다. 일반적인 시스템 개요를 얻을 수 있기를 원하지만 PID 또는 TID를 제공 해야하는 경우 괜찮습니다.

strace에 나타나는 프로그램 을 사용하지 않고 가고 싶습니다 iotop. 바람직하게 iotop는 파일 단위 로 분류되는 도구와 동일한 맥락에서 도구를 사용 합니다. lsofmailman이 어떤 파일을 열 었는지 볼 수 는 있지만 어떤 파일이 I / O를 받거나 얼마를 받는지는 나타내지 않습니다.

다른 곳에서 사용하도록 제안 auditd되었지만 다른 목적으로 사용하는 감사 파일에 정보를 넣을 수 있기 때문에 선호하지 않습니다. 이것은 내가 연구 할 수있는 문제처럼 보입니다. 이런 식으로.

내가 지금 가지고있는 구체적인 문제는 LVM 스냅 샷이 너무 빨리 채워지는 것입니다. 그 후 문제를 해결했지만 ls열려있는 모든 파일 설명자를 실행하여 /proc/<pid>/fd가장 빠르게 증가하는 것을 확인하는 대신이 방법으로 문제를 해결할 수 있기를 원합니다 .



예, 전에는 보지 못했지만이 질문에 대한 대부분의 답변은 기본적으로 다음과 같습니다. "만약 당신이 이처럼 엄청나게 구체적인 방식으로 일을하고 이상한 일을하면 이상한 생각을 가질 수 있습니다." 관리자가 너무 화려할 필요없이 문제. 나는 다른 사람들을 비판하려는 것이 아니며, 지금이 문제의 어려움은 아마도 그러한 해결책이 제공 된 방법 fatrace일 것임을 알고 있지만, 이전 과 같은 도구는 없지만 내가 쓴 스크립트와 같은 것이 있어야합니다. 더 널리 사용 가능하기 때문에 제공되었습니다.
Bratchley

분명히하기 위해 : 나는 도움을 제공 한 다른 사람들을 비판하지 않습니다. 도움은 항상 도움이없는 것보다 낫습니다. 문제가 솔직한 반응을 가져야한다고 생각할 때 실망 스럽습니다. 자신을 알아 내거나 다른 사람들이 귀찮은 해결 방법이나 매우 수동적 인 프로세스 (예 : 우체부 문제로 끝내는 것과 같은)를 제안하는 것을 볼 수 있습니다.
Bratchley

그래, 나는 잠시 동안 발굴 할 때까지 표시되지 않는 사이트에 묻힌 새로운 Q에 대한 답변을 찾을 때 항상 놀랐습니다. 8-)에서 깨진 것 같습니다. 그렇기 때문에 동일한 Q를 여러 가지 방법으로 물어보고 경로가 길어질 때 이전 Q와 연결하는 것이 좋습니다. 스크립트가 더 나은 접근법이라고 동의했지만, 당신이 요구하는 것을 수행하는 범용 도구가 없다는 것이 여전히 놀랍습니다. 유닉스에는 큰 차이가있는 것 같습니다.
slm

대부분의 도움말은 매우 성가신 목표로, 약간 성가 시게 될 수 있습니다. 그러나 이것이 SE 사이트의 본질입니다. Gilles가 어떻게하는지 모르겠습니다. 나는 이것들이 Q & A를 더 길게 형성하는 것을 좋아한다.
slm

답변:


58

이 질문에는 다른 도구를 통해 부분적으로 해결 된 몇 가지 측면이 있지만 원하는 모든 기능을 제공하는 단일 도구는 아닙니다.

아이오 톱

이 도구는 어떤 프로세스가 가장 많은 I / O를 소비하는지 보여줍니다. 그러나 특정 파일 이름을 표시하는 옵션이 없습니다.

$ sudo iotop
Total DISK READ:       0.00 B/s | Total DISK WRITE:       0.00 B/s
  TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND                                                        
    1 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % init
    2 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [kthreadd]
    3 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [ksoftirqd/0]
    5 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [kworker/u:0]
    6 rt/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [migration/0]
    7 rt/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [watchdog/0]

기본적으로 top디스크 I / O를 제외하고 CPU 시간 동안 경쟁하는 프로세스에서 정기적으로 수행하는 작업을 수행합니다. -a시간이 지남에 따라 프로세스별로 누적을 표시하도록 스위치 를 사용하여 3 만 피트의 시야를 제공하도록 동축 할 수 있습니다 .

$ sudo iotop -a
Total DISK READ:       0.00 B/s | Total DISK WRITE:       0.00 B/s
  TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND                                                        
  258 be/3 root          0.00 B    896.00 K  0.00 %  0.46 % [jbd2/dm-0-8]
22698 be/4 emma          0.00 B     72.00 K  0.00 %  0.00 % chrome
22712 be/4 emma          0.00 B    172.00 K  0.00 %  0.00 % chrome
 1177 be/4 root          0.00 B     36.00 K  0.00 %  0.00 % cupsd -F
22711 be/4 emma          0.00 B    120.00 K  0.00 %  0.00 % chrome
22703 be/4 emma          0.00 B     32.00 K  0.00 %  0.00 % chrome
22722 be/4 emma          0.00 B     12.00 K  0.00 %  0.00 % chrome

i * 도구 (inotify, iwatch 등)

이 도구는 파일 액세스 이벤트에 대한 액세스를 제공하지만 특정 디렉토리 또는 파일을 대상으로해야합니다. 따라서 성능 문제를 디버깅 할 때 알 수없는 프로세스로 악성 파일 액세스를 추적하려고 할 때 도움이되지 않습니다.

또한 inotify프레임 워크는 액세스되는 파일에 대한 특정 정보를 제공하지 않습니다. 이러한 도구를 사용하면 액세스 유형 만 가능하므로 앞뒤로 이동하는 데이터 양에 대한 정보를 사용할 수 없습니다.

iostat

주어진 장치 (하드 드라이브) 또는 파티션에 대한 액세스를 기반으로 전반적인 성능 (읽기 및 쓰기)을 표시합니다. 그러나 어떤 파일이 이러한 액세스를 생성하는지에 대한 통찰력을 제공하지는 않습니다.

$ iostat -htx 1 1
Linux 3.5.0-19-generic (manny)  08/18/2013  _x86_64_    (3 CPU)

08/18/2013 10:15:38 PM
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
          18.41    0.00    1.98    0.11    0.00   79.49

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda
                  0.01     0.67    0.09    0.87     1.45    16.27    37.06     0.01   10.92   11.86   10.82   5.02   0.48
dm-0
                  0.00     0.00    0.09    1.42     1.42    16.21    23.41     0.01    9.95   12.22    9.81   3.19   0.48
dm-1
                  0.00     0.00    0.00    0.02     0.01     0.06     8.00     0.00  175.77   24.68  204.11   1.43   0.00

blktrace

이 옵션이 너무 낮습니다. 원시 블록 번호만으로 액세스 할 파일 및 / 또는 inode에 대한 가시성이 부족합니다.

$ sudo blktrace -d /dev/sda -o - | blkparse -i -
  8,5    0        1     0.000000000   258  A WBS 0 + 0 <- (252,0) 0
  8,0    0        2     0.000001644   258  Q WBS [(null)]
  8,0    0        3     0.000007636   258  G WBS [(null)]
  8,0    0        4     0.000011344   258  I WBS [(null)]
  8,5    2        1 1266874889.709032673   258  A  WS 852117920 + 8 <- (252,0) 852115872
  8,0    2        2 1266874889.709033751   258  A  WS 852619680 + 8 <- (8,5) 852117920
  8,0    2        3 1266874889.709034966   258  Q  WS 852619680 + 8 [jbd2/dm-0-8]
  8,0    2        4 1266874889.709043188   258  G  WS 852619680 + 8 [jbd2/dm-0-8]
  8,0    2        5 1266874889.709045444   258  P   N [jbd2/dm-0-8]
  8,0    2        6 1266874889.709051409   258  I  WS 852619680 + 8 [jbd2/dm-0-8]
  8,0    2        7 1266874889.709053080   258  U   N [jbd2/dm-0-8] 1
  8,0    2        8 1266874889.709056385   258  D  WS 852619680 + 8 [jbd2/dm-0-8]
  8,5    2        9 1266874889.709111456   258  A  WS 482763752 + 8 <- (252,0) 482761704
...
^C
...
Total (8,0):
 Reads Queued:           0,        0KiB  Writes Queued:           7,       24KiB
 Read Dispatches:        0,        0KiB  Write Dispatches:        3,       24KiB
 Reads Requeued:         0       Writes Requeued:         0
 Reads Completed:        0,        0KiB  Writes Completed:        5,       24KiB
 Read Merges:            0,        0KiB  Write Merges:            3,       12KiB
 IO unplugs:             2           Timer unplugs:           0

Throughput (R/W): 0KiB/s / 510KiB/s
Events (8,0): 43 entries
Skips: 0 forward (0 -   0.0%)

Fatrace

이것은 Linux Kernel에 새로 추가되고 환영받는 것이므로 Ubuntu 12.10과 같은 최신 배포판에만 있습니다. 내 Fedora 14 시스템에는 8-)가 부족했습니다.

inotify특정 디렉토리 및 / 또는 파일을 대상으로하지 않고도 얻을 수있는 동일한 액세스를 제공 합니다.

$ sudo fatrace
pickup(4910): O /var/spool/postfix/maildrop
pickup(4910): C /var/spool/postfix/maildrop
sshd(4927): CO /etc/group
sshd(4927): CO /etc/passwd
sshd(4927): RCO /var/log/lastlog
sshd(4927): CWO /var/log/wtmp
sshd(4927): CWO /var/log/lastlog
sshd(6808): RO /bin/dash
sshd(6808): RO /lib/x86_64-linux-gnu/ld-2.15.so
sh(6808): R /lib/x86_64-linux-gnu/ld-2.15.so
sh(6808): O /etc/ld.so.cache
sh(6808): O /lib/x86_64-linux-gnu/libc-2.15.so

위는 파일 액세스를 수행하는 프로세스 ID와 액세스하는 파일을 보여 주지만 전체 대역폭 사용량을 제공하지 않으므로 각 액세스는 다른 액세스와 구분할 수 없습니다.

그래서 뭐 할까?

fatrace옵션 쇼 가장 약속을 마침내 당신에게 디스크의 총 사용을 보여줄 수있는 도구를 제공하는 I / O 파일이 아니라 액세스를 수행하는 프로세스보다 액세스하는 기반으로.

참고 문헌


5
사랑스런 아기 예수. 당신은 내가 아는 한 유닉스 SE의 록 스타와 같습니다. 당신은 항상 믿을 수 없을 정도로 교육적이고 많은 연구를 한곳에서 보여줍니다. 대부분의 사람들은 (그들이 알고 있다면) 마지막 부분을 게시 fatrace했을 것입니다. 나는 사람들이 완전한 그림을 이해하고 내가 단순히 투표하고 현상금을주는 것 이상을 할 수 있기를 바랍니다.
Bratchley

@JoelDavis-당신의 친절한 말에 감사드립니다. 정식 답변을한다는 아이디어가 마음에 들었습니다. 여기서 시작하려고했습니다. 나는이 문제를 여러 번 겪었고 이와 같은 리소스를 원했기 때문에 여기에서 8-)을 만들 것이라고 생각했습니다.
slm

내가 혼란스러워 한 가지 : 설치를 할 때 yum어떤 이유로 python3의 라이브러리를 가져 왔습니다. 나는 file그것을했고 ELF 실행 파일처럼 보입니다. ldd에 대한 링크가 표시 python되지 않았으며 strings. python3을 왜 귀찮게했는지 알고 있습니까?
Bratchley

1
BTW, 분명히 보상 현상금에 대한 답변을 수락 한 후 잠시 기다려야합니다. 그것은 유닉스 SE의 총액 평판 포인트의 약 절반을 가진 사람에게는 중요하지만 FYI는 아닙니다.
Bratchley

1
나에게는 실제로 문제가되지 않습니다. 나는 적절한를 통해 그것에 대해 필요한 정보를 얻을 수 iotopiostat통화를. 또한, 나는 파이썬을 알아 냈습니다. (적어도 Fedora 18에서) "power-usage-report" python스크립트 가있는 것처럼 보이 므로 RPM의 종속성에있는 yum사실에 응답했습니다 python. 그 특별한 미스터리가 해결되었습니다.
Bratchley

4

나는 아직 답을 얻지 못했지만이 스크립트를 (끝에) 작성했으며 원하는 것을하는 것처럼 보입니다. 다른 시스템에서 테스트하지 않았으며 Linux에 따라 다릅니다.

기본적으로 strace파일 관련 시스템 호출을 필터링하고 파일 이름을 제거하려고합니다. 파일에서 해당 파일의 발생 횟수를 계산하고 strace페이지 매김 요약을 사용자에게 제공합니다. 완벽하지는 않지만 특정 파일에 대한 시스템 호출 수는 I / O 수행 량과 약간의 상관 관계가있을 수 있습니다.

나는 그것을 완전히 테스트하지는 않았지만 그것이 즉시 작동하지 않으면 사람들에게 시작의 장소를 제공해야합니다. 더 이상 문제가 없으면 python과 같은 고급 언어로 다시 작성하는 것이 좋습니다 .

이 작업을 수행하는 덜 가정적인 방법으로 일주일 이내에 답변을 얻지 못하면 (특정 프로세스의 I / O를 계산하는 다른 도구 인 경우에도)이 정보를 후손에 대한 답변으로 받아들입니다.

스크립트:

#!/bin/bash

####
# Creates files underneath /tmp
# Requires commands: timeout  strace  stty
####
#
# All commands are GNU unless otherwise stated
#
##########################################################


####
## Initialization
####

outputFile=/tmp/out.$RANDOM.$$
uniqueLinesFile=/tmp/unique.$RANDOM.$$
finalResults=/tmp/finalOutput.txt.$$

if [ $# -ne 1 ]; then
    echo "USAGE: traceIO [PID]" >&2
    exit 2
fi

if ! [[ "$1" =~ ^[0-9]+$ ]]; then
    echo "USAGE: traceIO [PID]" >&2
    echo -e "\nGiven Process ID is not a number." >&2
    exit 2
fi

if [ ! -e /proc/$1 ]; then
    echo "USAGE: traceIO [PID]" >&2
    echo -e "\nThere is no process with $1 as the PID." >&2
    exit 2
fi

if [[ "x$PAGER" == "x" ]]; then

   for currentNeedle in less more cat; do

      which $currentNeedle >/dev/null 2>&1

      if [ $? -eq 0 ]; then
         PAGER=$currentNeedle
         break;
      fi

   done

  if [[ "x$PAGER" == "x" ]]; then

     echo "Please set \$PAGER appropriately and re-run" >&2
     exit 1

  fi

fi

####
## Tracing
####

echo "Tracing command for 30 seconds..."

timeout 30 strace -e trace=file -fvv -p $1 2>&1 | egrep -v -e "detached$" -e "interrupt to quit$" | cut -f2 -d \" > $outputFile

if [ $? -ne 0 ]; then
   echo -e "\nError performing Trace. Exiting"
   rm -f $outputFile 2>/dev/null
   exit 1
fi

echo "Trace complete. Preparing Results..."

####
## Processing
####

sort $outputFile | uniq > $uniqueLinesFile

echo -e "\n--------  RESULTS --------\n\n  #\t Path " > $finalResults
echo -e " ---\t-------" >> $finalResults

while IFS= read -r currentLine; do

   echo -n $(grep -c "$currentLine" "$outputFile")
   echo -e "\t$currentLine"

done < "$uniqueLinesFile" | sort -rn >> $finalResults

####
## Presentation
####

resultSize=$(wc -l $finalResults | awk '{print $1}')
currentWindowSize=$(stty size | awk '{print $1}')

  # We put five literal lines in the file so if we don't have more than that, there were no results
if [ $resultSize -eq 5 ]; then

   echo -e "\n\n No Results found!"

elif [ $resultSize -ge $currentWindowSize ] ; then

   $PAGER $finalResults

else

   cat $finalResults

fi

  # Cleanup
rm -f $uniqueLinesFile $outputFile $finalResults

2

iWatch를 사용하여 iwatch를 사용할 수 있습니다

iWatch는 사용이 매우 간단합니다. / etc 파일 시스템의 변경 사항을보고 싶다면 콘솔에서 실행하면됩니다.

$ iwatch /etc

iwatch는이 디렉토리에서 변경 사항이 있는지 알려줍니다. 이메일로 알림을 받으려면 :

$ iwatch -m admin@smsgw.local /etc

이 경우 관리자는 이메일 알림을 받게됩니다 (SMS 게이트웨이 계정을 사용할 수 있으므로 언제 어디서나 즉시 알람이 울립니다). 많은 차이 디렉토리를 모니터하려는 경우 구성 파일을 사용할 수 있습니다. 이 구성 파일은 이해하기 쉬운 구조의 xml 파일입니다.


1
이것이 사용하고 있다고 inotify생각합니다. 나는 inotify당신이 경로를 제공해야하기 때문에 (기본적으로 내가 찾고있는 것이므로) 무엇이든 사용하는 것을 주저했으며 , 모든 것을 아래에서 수행했을 때 얼마나 많은 오버 헤드가 있는지 걱정했습니다 .PID로 /필터 할 수 있습니까? 어떤 프로그램이 수행하고 있는지 쉽게 추출 할 수 있다면 일시적인 속도 저하를 견딜 수 있습니다. 웹 사이트에는 명령 출력 예제도 없습니다.
Bratchley

1
@JoelDavis Im 확실하지 않습니다. 내가 아는 한 엄청난 양의 RAM을 사용하므로 "/"에서 실행하면 위험합니다.
vfbsilva
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.