다중 사용자 시스템에서 CPU 시간을 초 단위로 각 사용자의 CPU 사용량을 측정하고 싶습니다. 이 측정을 위해 PID가 사용자에게 속하는 경우이 사용자가 CPU 시간을 유발한다고 가정합니다. 즉, 데몬과 커널을 무시하고 있습니다.
현재 5 초 마다이 작업을 수행하고 있습니다.
- 각 사용자와 그들이 실행하고있는 PID를 얻습니다
ps aux
- 각 PID를 들어, 수
x
의 합 utime와, cutime, STIME 및 cstime을에서/proc/[pid]/stat
- 계산
t = x / interval
(부하가 높을 때 간격이 항상 정확히 5 초인 것은 아님)
이것을 실행하면 합리적인 가치를 얻을 수 있습니다. 예를 들어,이 시스템의 사용자는 파이썬 ( while True: pass
) 으로 회전 하고 있으며 시스템은 초당 약 750 밀리 초의 CPU 시간을 표시합니다. 시스템이 잠시 정지했을 때 1 초의 1 초 동안 1600ms를보고했습니다. 어느 것이 옳은 것처럼 보이지만, 나는 실제로 가치를 이해 하지 못한다면 이러한 가치를 결정할 수 있다는 것을 이해 하지 못합니다 .
그래서 내 질문은 이것입니다 :
사용자별로 CPU로드를 측정하는 공정하고 올바른 방법은 무엇입니까?
방법은 다소 정확해야합니다. 이 시스템에는 수백 명의 사용자가있을 수 있으므로 백분율을 추출하는 ps aux
것은 특히 정확하지 않을 것입니다. 특히 많은 소프트웨어 조각이 생성되는 단기 스레드에 대해서는 그렇습니다.
이것은 복잡 할 수 있지만 가능하다는 것을 절대적으로 알고 있습니다. 이것이 나의 출발점이었습니다.
커널은 프로세스 생성 시간과 수명 동안 소비 한 CPU 시간을 추적합니다. 각 클럭 틱마다 커널은 현재 프로세스가 시스템 및 사용자 모드에서 소비 한 시간을 지프 단위로 업데이트합니다. — ( Linux 문서 프로젝트에서 )
내가 따르는 값은 시스템로드 또는 CPU 사용량의 백분율이 아닌 사용자가 CPU에 소비 한 초 (또는 지프)입니다.
프로세스가 계속 실행되는 동안 CPU 시간을 측정하는 것이 중요합니다. 일부 프로세스는 0.5 초 동안 만 지속되고 일부 프로세스는 몇 개월 동안 지속될 수 있으며, 두 가지 유형을 모두 잡아야 세밀하게 사용자의 CPU 시간을 처리 할 수 있습니다.
top
배치 모드 를 수행 할 수 있다는 것을 알고 있습니까? top -b -n 1 -u {user} | awk 'NR>7 { sum += $9; } END { print sum; }'
그 순간 {user}의로드를 표시해야합니다.