/proc/[PID]/stat 하위 프로세스에 대한 누적 CPU 통계를 표시할지 여부

/proc/[PID]/stat 하위 프로세스에 대한 누적 CPU 통계를 표시할지 여부

질문을 올바르게 표현했는지 잘 모르겠습니다. 읽어보았지만 man proc정답을 찾을 수 없었고 이를 확인할 수 있는 쉬운 방법도 없었습니다.
PID의 CPU/RAM 소비량을 얻으려고 하는데 프로그램이 캐스팅할 하위 프로세스 수를 모르고 메인 프로세스뿐만 아니라 CPU 및 RAM 소비량의 총량을 얻고 싶습니다.
사실과 경험은 모든 하위 프로세스를 통해 축적된다는 것을 알고 있지만 /proc/[PID]/io, 가능하다면 에도 동일하게 적용된다면 증거를 제공하는지 알고 싶습니다 /proc/[PID]/stat.

답변1

결론적으로:
전체 설명을 읽고 싶지 않다면 다음 내용을 읽으십시오.
예, /proc/[PID]/stat에 포함된 값을 사용하면 프로세스와 해당 하위 프로세스에서 사용하는 CPU 시간의 양을 결정할 수 있습니다.
그러나 자식 프로세스의 CPU 시간 값은 자식 프로세스가 종료될 때만 업데이트되므로 실시간 모니터링에는 사용할 수 없습니다.

설명하다:
시간을 기준으로 man time다음 통계를 반환합니다 .

이러한 통계에는 (i) 호출과 종료 사이에 경과된 실시간 시간, (ii) 사용자 CPU 시간(times(2)에서 반환된 구조체 tms의 tms_utime 및 tms_cutime 값의 합), (iii) 시스템 CPU 시간( (2) 반환된 tms 구조의 tms_stime 및 tms_cstime 값의 합입니다.

누구든지 읽으면 man times구조가 다음과 같이 정의되어 있음을 이해할 수 있습니다.

struct tms {
   clock_t tms_utime;  /* user time */
   clock_t tms_stime;  /* system time */
   clock_t tms_cutime; /* user time of children */
   clock_t tms_cstime; /* system time of children */
};

이는 명령이 프로세스와 모든 하위 프로세스에 대한 누적 사용자 및 시스템 CPU 시간을 반환한다는 것을 의미합니다.
이제 우리는 그것으로부터 무엇을 추출할 수 있는지 알아야 합니다 /proc. man proc섹션 에서 /proc/[PID]/stat다음 정보를 추출할 수 있습니다.

(14) utime %lu
사용자 모드에서 프로세스가 예약된 시간(클럭 주기)(sysconf(_SC_CLK_TCK)으로 나눔). 여기에는 guest_time 필드를 인식하지 못하는 애플리케이션이 계산에서 이 시간을 잃지 않도록 guest_time(가상 CPU를 실행하는 데 소요된 시간, 아래 참조)이 포함됩니다.
(15) stime %lu
커널 모드에서 프로세스가 예약된 시간(클록 주기)(sysconf(_SC_CLK_TCK)으로 나눔).
(16) cutime %ld
이 프로세스의 대기 중인 하위 프로세스가 사용자 모드에서 예약된 시간(클럭 주기(sysconf(_SC_CLK_TCK)으로 나눔))입니다. (times(2)도 참조하십시오.) 여기에는 게스트 시간인 cguest_time(가상 CPU를 실행하는 데 소요된 시간, 아래 참조)이 포함됩니다.
(17) cstime %ld
프로세스의 대기 중인 하위 프로세스가 커널 모드에서 예약된 시간(클럭 주기(sysconf(_SC_CLK_TCK)으로 나눔))입니다.

따라서 기본적으로 이 /proc/[PID]/stat파일에는 CPU 시간을 초 단위로 결정하는 데 사용되는 시간 값이 포함되어 있습니다.

time load.sh이 지식을 바탕으로 다음과 같이 스크립트를 실행 하고 스크립트 끝을 추가해 보았습니다 . cat /proc/$$/stat결과는 다음과 같습니다.

9398 (load.sh) S 5379 9398 5379 34817 9398 4194304 1325449 7562836 0 0 192 520 3964 1165 20 0 1 0 814903 14422016 1154 18446744073709551615 4194304 5242124 140726473818336 0 0 0 65536 4 65538 1 0 0 17 3 0 0 818155 0 0 7341384 7388228 9928704 140726473827029 140726473827049 140726473827049 140726473830382 0  

명령의 출력은 다음과 같습니다 time.

real    0m38,783s
user    0m41,576s
sys     0m16,866s

필요 에 따라 man proc열 14, 15, 16 및 17을 살펴보십시오 . 192 520 3964 1165따라서 사용자/시스템 CPU에서 프로세스와 해당 하위 항목이 소비한 시간을 합산해 보겠습니다.

192+3964 = 4156  <=>  user 0m41,576s
520+1165 = 1685  <=>  sys  0m16,866s

잠깐, CPU 시간은 정확하게 누적되지는 않지만 프로그램과 해당 하위 프로세스에서 사용하는 CPU 시간을 매우 정확하게(100분의 1초) 계산할 수 있습니다 /proc/[PID]/stat.

편집하다:
추가 테스트와 사람들과의 대화 끝에 마침내 답을 얻었고 다음이 포함된 스크립트를 실행했습니다.

#!/bin/bash
sleep 5
time stress --cpu 4 -t 60s --vm-hang 15
sleep 5
cat /proc/$$/stat | cut -d ' ' -f 14-17
exit

/proc/$$/stat그리고 동시에 표시기를 모니터링하기 위해 시계를 사용합니다. 하위 프로세스가 완료되지 않는 한 카운터는 업데이트되지 않습니다. 완료 되면 stress에 표시된 값이 /proc/$$/stat업데이트되고 time명령 /proc및 의 열 14와 17 사이에 유사한 결과가 표시됩니다.

오래된 편집 모든 것이 끝났다고 생각했지만 더 많은 조사를 한 후 명령을 사용하여 동일한 작업을 시도했습니다.stress

time stress --cpu 4 -t 60s  
stress: info: [18598] dispatching hogs: 4 cpu, 0 io, 0 vm, 0 hdd
stress: info: [18598] successful run completed in 60s
real    1m0,003s
user    3m53,663s
sys     0m0,349s

실행하는 동안 초당 2번 명령 결과를 관찰합니다.

cat /proc/11223/stat | cut -d ' ' -f 14-17
0 0 0 0

하지만 이는 네 스레드의 아버지 ps faux | grep stress로서 이 특정 PID를 제공할 것입니다 .stress

관련 정보