사용자의 총 CPU 시간을 측정하기 위해 다음의 "utime" 필드를 사용했습니다 /proc/[pid]/stat
.
utime %lu Amount of time that this process has been scheduled in user
mode, measured in clock ticks (divide by
sysconf(_SC_CLK_TCK). This includes guest time, guest_time
(time spent running a virtual CPU, see below), so that
applications that are not aware of the guest time field do
not lose that time from their calculations.
(에서휴먼프로세스(5))
utime
따라서 내 "사용자 utime"은 이 사용자가 실행 중인 모든 PID의 합계입니다.
이를 통해 이 사용자가 소비한 CPU 시간(초)에 대한 정확한 값을 얻을 수 있기를 바랍니다. 나는 올바른 길을 가고 있습니까?
제가 이해하지 못했거나 고려하지 못한 몇 가지 사항이 있습니다.
- 각 PID에는 상위 PID(또는 0)도 있습니다. 하지만 나는 ppid가 0인 PID뿐만 아니라 모든 PID를 계산하고 있습니다. 이 올바른지?
- utime 외에도 stime, cuttime 및 cstime이 있습니다. 제가 이것에 대해 걱정할 필요가 있나요? utime은 상위 프로세스를 제외한 PID의 총 CPU 초 수라고 가정합니다.
다음을 사용하여 시스템의 총 CPU 시간을 /proc/uptime
계산 하면상당히모든 사용자를 합친 것에 대해 얻을 수 있는 것과 비슷하지만 큰 차이가 있습니다. 예(분):
system cpu_time: 96.13
sum of users_cputime: 111.45
옳은:
나는 다양한 것에 대해 "외견상 합리적인" 가치관을 가지고 있습니다. 현재 저는 utime, stime, cuttime 및 cstime의 합계를 사용하고 있습니다. 보고되는 값은 측정값과 밀접하게 관련되어 있지만 이해할 수는 없습니다 time
.
내가 정확히 잘못된 방향으로 가고 있다면 여기에 또 다른 질문이 있습니다.
- 사용자당 총 CPU 시간을 모니터링하는 가장 공정한 방법은 무엇입니까?우분투에 물어보세요 (+500 현상금)
답변1
사용자 CPU 시간을 기록하고 추적하는 전통적인 방법은 다음과 같습니다.프로세스 회계. 리눅스에서는 설치하세요GNU 회계 유틸리티, 일반적으로 라는 패키지에서 제공됩니다 acct
. 수명이 매우 짧은 프로세스에서 소요된 시간을 추적하는 것이 얼마나 정확한지는 잘 모르겠지만 적어도 실행된 모든 프로세스를 나열합니다.
달리기lastcomm
모든 사용자가 실행한 모든 명령 목록과 각 명령에 소요된 시간을 가져옵니다(짧은 프로세스의 경우 최대 약 10밀리초로 반올림됨, 많이 표시될 것으로 예상됨 0.00
). 달리기sa
다양한 합계 및 통계를 표시합니다. 특히, sa -m
각 사용자에 대한 합계가 표시됩니다. sa
계정 로그(보통 위치)의 마지막 순환 이후 누적된 통계입니다 /var/log/account/
.
주기적인 샘플링으로 모든 프로세스를 포착할 수는 없지만, 그것과는 거리가 멀다는 점에 유의하세요. 거의 모든 단기 프로세스와 긴 프로세스의 마지막 몇 초를 놓치게 됩니다. 프로세스 회계는 모든 과거 프로세스를 나열합니다.
에서 /proc/$pid/stat
사용자 시간은 I/O를 수행하는 데 소요된 시스템 시간이 아니라 계산을 수행하는 데 소요된 시간입니다. 어느 것을 계산할지는 정보로 무엇을 하려는지에 따라 달라집니다.
모든 PID에 대한 통계가 정확합니다. 부모 PID가 이것과 어떤 관련이 있는지 모르겠습니다.
시스템 측면에서 설명이 /proc/uptime
잘못된 것 같습니다.위키피디아내가 쓴대로. 첫 번째 필드는 시스템이 시작된 이후 경과된 실제 시간에서 일시 중지 또는 최대 절전 모드로 소요된 시간을 뺀 값입니다. 두 번째 필드는 모든 CPU에서 유휴 작업에 소요된 누적 시간입니다. 이것이 정확히 무엇을 의미하는지 잘 모르겠습니다. 확실히 내 컴퓨터의 총 유휴 시간은 아닙니다. 커널에서 값을 합산합니다.존재하다uptime_proc_show
업데이트의 변수존재하다account_idle_time
.