PID 네임스페이스의 총 CPU 사용량 계산

PID 네임스페이스의 총 CPU 사용량 계산

특정 PID 네임스페이스에 있는 모든 프로세스의 CPU 사용량을 모니터링하고 싶습니다. 프로그래밍 방식으로 이 작업을 수행하고 싶습니다(가능한 경우 C). 나는 이 작업을 수행하는 방법을 알고 있지만 Linux가 더 쉽고 더 나은 방법을 제공하는지 궁금합니다.

예를 들어, 네임스페이스 초기화 프로세스의 합계만 사용하여 총 CPU 사용량을 얻을 수 있습니까 cutime? 또한 루트 네임스페이스 대신 cstime네임스페이스의 파일 시스템을 마운트하면 해당 특정 네임스페이스에 대한 CPU 사용률만 표시됩니까?/proc/proc/stat

가능한 해결책:

  • PID 네임스페이스 내에서 새 프로세스를 시작합니다.
  • 네임스페이스의 /proc파일 시스템을 안전한 곳에 마운트합니다.
  • 몇 밀리초마다 /proc디렉터리를 읽고 디렉터리에 나열된 각 프로세스의 CPU 사용량을 계산합니다.
  • IPC를 사용하여 집계 값을 상위 프로세스에 전달

답변1

예를 들어, 네임스페이스 초기화 프로세스의 합계만 사용하여 총 CPU 사용량을 얻을 수 있습니까 cutime?cstime

여기에는 시간만 포함됩니다.대기 중(따라서 종료) 하위 프로세스 및 하위 프로세스(또는 ripped-processes 의 경우 init). 따라서 죽은 고아 프로세스의 시간만 얻을 수 있습니다.

네임스페이스의 모든 프로세스에 대한 cuttime 및 cstime의 합계를 계산하는 경우(경합 조건 주의) 네임스페이스에 조인된 프로세스를 제외하고 해당 네임스페이스에 있는 모든 현재 및 과거 프로세스의 누적 시간을 가져와야 합니다(예: nsenter -p) , 시간이 계산됩니다. 원래 네임스페이스에 상위 프로세스를 입력합니다(가져온 네임스페이스에서 이 프로세스의 PPID가 0인 것으로 나타났습니다).

/proc또한 루트 네임스페이스 대신 네임스페이스의 파일 시스템을 마운트하면 /proc/stat해당 특정 네임스페이스에 대한 CPU 사용률만 표시됩니까?

확인하기 쉽습니다.

$ grep cpu /proc/stat
cpu  69003764 88576 8499514 244070762 5120799 0 407453 0 0 0
cpu0 34269946 49008 4228860 122466614 2365498 0 55409 0 0 0
cpu1 34733818 39567 4270653 121604147 2755300 0 352044 0 0 0
$ sudo unshare --mount-proc -mpf grep cpu /proc/stat
cpu  69005266 88576 8499588 244072663 5120837 0 407462 0 0 0
cpu0 34270449 49008 4228896 122467803 2365522 0 55410 0 0 0
cpu1 34734816 39567 4270692 121604860 2755315 0 352051 0 0 0

그래서 그렇지 않은 것 같습니다.

AFAICT, 루트 네임스페이스에서 통계를 계산할 수 있어야 합니다.

예를 들어 pid 네임스페이스의 경우 및 다음을 $pid사용합니다 .zshperl

perl -l -0777 -ne '
   if (/\(.*\)(?: .*?){12} (.*?) (.*?) (.*?) (.*?)/) {$s+=$1+$2+$3+$4}
   END{print $s}' /proc/*/ns/pid(e:'[[ $REPLY -ef /proc/$pid/ns/pid ]]'::h:s/ns/stat)

즉, pid 와 동일한 네임스페이스에 있는 모든 프로세스에 대해 /proc/pid/stat의 필드 14~17을 추가합니다 $pid.

위에서 언급했듯이 여기에는 nsenter나중에 네임스페이스를 편집하고 종료되는 프로세스의 시간은 포함되지 않습니다(또한 그들이 기다리고 있던 하위 프로세스도 포함되지 않습니다(다른 프로세스는 네임스페이스의 초기화로 인해 분리된 것으로 보임).

관련 정보