이것은 간단한 문제이지만 처음으로 이 문제를 해결했습니다. 가장 많은 I/O의 대상이 되는 특정 파일/inode를 찾으십시오. 일반적인 시스템 개요를 얻을 수 있으면 좋겠지만 PID나 TID를 제공해야 한다면 괜찮습니다.
strace
나는 팝업되는 프로그램으로 아무것도 하고 싶지 않습니다 iotop
. iotop
파일별로 항목별로 분류된 동일한 도구를 사용하는 것이 가장 좋습니다 . 나는 그것을 사용하여 lsof
mailman이 어떤 파일을 열었는지 볼 수 있지만 어떤 파일이 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]
기본적으로 top
CPU 시간을 놓고 경쟁하는 일반 프로세스 쌍의 작업을 수행합니다(디스크 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
당신은 그것을 사용할 수 있습니다sysdig
topfiles_bytes
바로 그 일을 하는 끌이라는 끌이 있습니다 .
예:
sysdig -c topfiles_bytes
sysdig -c topfiles_time
사용 가능한 끌을 모두 나열합니다.
sysdig -cl
답변4
사용 오토프가장 많은 io 로드를 유발하는 프로세스의 pid를 가져옵니다. 다음 번에 사용라소프pid로 연 파일 목록을 가져옵니다.