단기 프로세스에 대한 I/O 통계를 보려면 어떻게 해야 합니까?

단기 프로세스에 대한 I/O 통계를 보려면 어떻게 해야 합니까?

init와 같은 장기 실행 프로세스의 경우 다음과 같은 작업을 수행할 수 있습니다.

$ cat /proc/[pid]/io

단기 프로세스(예: ls와 같은 명령줄 유틸리티)에 대한 통계를 보려면 어떻게 해야 합니까? 이렇게 짧은 프로세스의 pid를 보는 방법조차 모르겠습니다...

답변1

기본적으로 런타임 시 애플리케이션 I/O 프로파일링에 대한 일반적인 조언이 필요한 것 같습니다. 이제 이 작업을 완료했으므로 /proc/$PID/io애플리케이션이 디스크와 메모리 사이에서 얼마나 많은 대역폭을 사용하고 있는지 알 수 있습니다. 이 파일을 폴링하면 프로세스가 수행 중인 작업에 대한 대략적인 아이디어를 얻을 수 있지만 디스크로 또는 디스크에서 푸시되는 데이터의 양만 보여주기 때문에 불완전한 그림입니다.

귀하가 요청한 문제를 해결하려면 기본적으로 다음과 같은 옵션이 있습니다.

  • 플랫폼 도구를 사용하십시오. 리눅스에서SystemTap 스크립트 작성기능이 가장 완벽한 솔루션이지만 원하는 핵심 수준에 따라 원하는 이점을 얻기 위해 실제로 지출하려는 것보다 더 많은 작업이 필요할 수 있습니다.

  • 앱 기반 계측을 사용합니다. 이를 수행하는 방법에는 여러 가지가 있지만gprof 소개인기있는 선택입니다. 일부 애플리케이션은 자체 도구를 제공할 수도 있지만 확인해야 합니다.

아마도 가장 좋은 옵션은 기존 플랫폼 계측 도구를 함께 사용하여 원하는 효과를 얻고 최대한 활용하는 것입니다.


나는 응용 프로그램을 시작하고 이 모든 작업을 수행할 수 있는 프로그램을 모릅니다(없다는 의미는 아니며 들어본 적이 없다는 뜻입니다). 따라서 가장 좋은 방법은 시스템 전체에서 수집을 시작하는 것입니다. 정보를 수집하고 관심 있는 PID를 필터링하면 완전한 샘플을 얻을 수 있습니다.

execve먼저, 시작되는 애플리케이션의 PID를 저장할 수 있도록 호출 감사를 활성화하겠습니다 . PID가 있으면 감사를 삭제할 수 있습니다.

mount debugfs -t debugfs /sys/kernel/debug을 실행할 수 있도록 debugfs를 실행하려면 실행하세요 blktrace.

내 시스템에서 이것을 실행했지만 blktrace -d /dev/sda -a read -a write -o - | blkparse -i -그에 따라 조정할 수 있습니다. 다음은 blktrace 출력의 몇 가지 예입니다.

8,0   15        3 1266874889.709440165 32679  Q   W 20511277 + 8 [rpc.mountd]

위 출력에서 ​​다섯 번째 열( 32679)은 쓰기를 수행한 애플리케이션과 연결된 PID입니다. 우리가 관심을 갖는 부분은 Q(이벤트 유형, 대기열에 있음) W(RWBS 필드로, W해당 필드에 아무것도 없기 때문에 쓰기임을 나타냅니다. 즉, S비동기식임을 의미합니다.) 및 20511277 + 8(작업은 블록 번호 20511277에서 시작하여 20511277 동안 계속됩니다. 또 다른 8개 블록). 읽기/쓰기 크기를 결정하려면 블록을 더하고 블록 크기를 곱하면 됩니다.

blktrace또한 처리량 이상의 정보를 제공하며 관심 있는 병합에 어떤 일이 일어나고 있는지 확인할 수도 있습니다.

blktrace가 실행되면 다음을 사용하여 프로세스를 생성할 수 있습니다.strace-c이를 통해 각 시스템 호출( read및 작업 포함)과 write관련된 평균 대기 시간에 대한 아이디어를 얻을 수 있습니다. 지연 시간은 각 호출에 필요한 안정성에 따라 중요할 수 있으며, 애플리케이션 계측 없이 애플리케이션이 수행하는 작업(조정을 위해 탐색해야 하는 영역 지적)에 대해 더 많은 정보를 제공할 수도 있습니다.

둘 사이에서 데이터 손실이나 다른 응용 프로그램의 I/O를 포함하지 않고 프로그램이 무엇을 하고 있는지에 대한 좋은 아이디어가 있어야 합니다. 분명히 내가 설명한 것보다 더 많은 방법이 있지만 이것이 내 문제를 해결한 방법입니다.

blkparse예를 들어, 스크램블된 출력 옵션을 통해 I/O 관련 대기 시간 측정값을 수집할 수도 있어야 합니다. 나는 그들과 충분히 놀지 않았기 때문에 그것을하지 않았습니다.

답변2

백그라운드에서 명령을 시작하고 변수를 통해 해당 pid를 가져올 수 있습니다 $!.

예:

$ ls & cat /proc/$!/io
[1] 6410
rchar: 7004
wchar: 0
syscr: 13
syscw: 0
read_bytes: 0
write_bytes: 0
cancelled_write_bytes: 0

관련 정보