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

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

이것은 간단한 문제이지만 처음으로 이 문제를 해결했습니다. 가장 많은 I/O의 대상이 되는 특정 파일/inode를 찾으십시오. 일반적인 시스템 개요를 얻을 수 있으면 좋겠지만 PID나 TID를 제공해야 한다면 괜찮습니다.

strace나는 팝업되는 프로그램으로 아무것도 하고 싶지 않습니다 iotop. iotop파일별로 항목별로 분류된 동일한 도구를 사용하는 것이 가장 좋습니다 . 나는 그것을 사용하여 lsofmailman이 어떤 파일을 열었는지 볼 수 있지만 어떤 파일이 I/O를 받고 있는지, 얼마나 많은 파일을 받는지는 나타내지 않습니다.

다른 곳에서 이 기능을 사용하라는 권장 사항을 본 적이 있지만 auditd그렇게 하고 싶지 않습니다. 왜냐하면 다른 목적으로 사용하는 감사 파일에 정보가 저장되기 때문이며, 이는 제가 이렇게 조사할 수 있어야 할 것 같습니다.

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

답변1

이 문제의 여러 측면은 다른 도구를 통해 부분적으로 해결되었지만 원하는 모든 기능을 제공하는 도구는 없는 것 같습니다.

오토프

이 도구는 어떤 프로세스가 가장 많은 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]

기본적으로 topCPU 시간을 놓고 경쟁하는 일반 프로세스 쌍의 작업을 수행합니다(디스크 I/O 제외). 스위치를 사용하여 30,000피트 높이의 뷰를 제공하도록 지시하여 -a시간에 따른 프로세스 누적을 표시할 수 있습니다.

$ 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

블록 추적

이 옵션은 수준이 너무 낮습니다. 어떤 파일 및/또는 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%)

파트라스

이는 Linux 커널의 새로운 기능이며 인기가 높아 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 사용량을 표시하는 도구를 제공합니다.

인용하다

답변2

아직 답변은 없지만 (마침내) 이 스크립트를 작성했는데 원하는 대로 작동하는 것 같습니다. 다른 시스템에서는 테스트하지 않았으며 Linux에만 해당됩니다.

기본적으로 30초 동안 반복하고 strace, 파일 관련 시스템 호출을 필터링하고, 파일 이름을 제거하려고 시도합니다. 파일이 나타나는 횟수를 계산 strace하고 사용자에게 페이지가 매겨진 요약을 제공합니다. 완벽하지는 않지만 특정 파일에 대한 시스템 호출 수는 수행하는 I/O 양과 약한 상관 관계를 가질 수 있습니다.

아직 완전히 테스트하지는 않았지만 즉시 작동하지 않는 경우 사람들에게 시작점을 제공해야 합니다. 더 구체화되면 더 높은 수준의 언어로 다시 작성하는 것이 좋습니다.비단뱀처럼.

덜 직접 만든 방법으로 일주일 이내에 답변을 얻지 못하면(특정 프로세스에 대한 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

답변3

당신은 그것을 사용할 수 있습니다sysdigtopfiles_bytes바로 그 일을 하는 끌이라는 끌이 있습니다 .

예:

sysdig -c topfiles_bytes
sysdig -c topfiles_time

사용 가능한 끌을 모두 나열합니다.

sysdig -cl

답변4

사용 오토프가장 많은 io 로드를 유발하는 프로세스의 pid를 가져옵니다. 다음 번에 사용라소프pid로 연 파일 목록을 가져옵니다.

관련 정보