상단과 PS에 동일한 CPU 결과가 표시되지 않음


54

이것은 질문에 연결되어 있습니다.

실행 top하면 다음과 같은 결과가 나타납니다.

여기에 이미지 설명을 입력하십시오

pid 3038는 18 % CPU를 사용하지만 실행시

여기에 이미지 설명을 입력하십시오

결과는 5.5 %입니다. 그리고이 숫자는 시간이 지남에 따라 변하지 않는 것처럼 보입니다 (즉, 같은 명령을 조금 나중에 실행할 때) ...

는 IS ps명령은 어떻게 든 CPU 사용량을 평균?

답변:


87

man psNOTES섹션을 참조하십시오.

   CPU usage is currently expressed as the percentage of time spent running
   during the entire lifetime of a process.  This is not ideal, and it does not
   conform to the standards that ps otherwise conforms to.  CPU usage is
   unlikely to add up to exactly 100%.

그리고 당신도 알고 있다고 생각하지만, 당신은 또한 할 수 있습니다 :

top -p <PID>

편집 : 다른 답변에 대한 귀하의 의견;

" 흠 그래, 난 ps에서 그 (즉시 CPU 비율)를 얻는 방법 궁금해 "

짧은 대답 : 당신은 할 수 없습니다.

왜 그래야만하지?

누군가에게 사진에서 자동차의 속도를 계산하도록 요청하는 것과 같습니다.

top모니터링 도구 인 동안 ps스냅 샷 도구입니다. 다음과 같이 생각하십시오 : 주어진 순간에 프로세스는 CPU를 사용하거나 사용하지 않습니다. 따라서 정확한 순간에 0 % 또는 100 %의 부하가 발생합니다.

제공 : 즉시 CPU 사용량을ps 제공해야하는 경우 0 % 또는 100 %입니다.

top 반면에 폴링 번호를 유지하고 시간에 따른 부하를 계산합니다.

ps현재 사용량을 줄 수 있지만 데이터를 여러 번 읽고 각 읽기 사이에 휴면 상태 여야합니다. 그렇지 않습니다.

ps % cpu에 대한 계산

ps 다음과 같은 방식으로 CPU 사용량을 계산합니다.

가동 시간 = 총 시간 시스템이 실행되었습니다.
ps_time = 부팅 후 초 단위로 측정 된 프로세스 시작 시간입니다.
pu_time = 총 시간 프로세스가 CPU를 사용하고 있습니다.

;; 초 프로세스가 실행 중입니다.
초 = 가동 시간-ps_time
;; 용법:
cpu_usage = pu_time * 1000 / 초

인쇄 : cpu_usage / 10 "." cpu_usage % 10


예: 가동 시간 = 344,545 ps_time = 322,462 pu_time = 3,383 초 = 344,545-322,462 = 22,083 cpu_usage = 3,383 * 1,000 / 22,083 = 153 인쇄 : 153/10 "." 153 % 10 => 15.3

따라서 인쇄 된 수는 프로세스가 CPU 수명 동안 사용 된 시간입니다. 위의 예에서와 같이. 수명의 15.3 % 만에 그렇게했습니다. 84,7 %의 시간 동안 CPU에서 버그가 발생하지 않았습니다.

데이터 검색

ps뿐만 아니라 top, 아래에 저장된 파일의 데이터를 사용 /proc/하거나 - 프로세스 정보 가상 파일 시스템을 .

루트의 일부 파일 /proc/에는 시스템의 전체 상태에 대한 다양한 정보가 있습니다. 또한 각 프로세스에는 /proc/<PID>/프로세스 특정 데이터가 저장되는 자체 하위 폴더 가 있습니다. 예를 들어 질문의 프로세스에는에 폴더가 /proc/3038/있습니다.

psCPU 사용량을 계산할 때 두 파일을 사용합니다.

/ proc / uptime 시스템의 가동 시간 (초) 및 유휴 프로세스에 소요 된 시간 (초).
/ proc / [PID] / stat 프로세스에 대한 상태 정보.
  • 에서 uptime그 첫 번째 값 (사용 가동 시간 ).
  • 에서 [PID]/stat그 다음을 사용합니다 :
 # 이름 설명
jiffies로 측정 한 사용자 코드에서 14 시간의 CPU 시간 소비
커널 코드에서 소요 된 15 시간 CPU 시간
어린이의 시간을 포함하여 사용자 코드에 소비 된 16 cutime CPU 시간
자녀의 시간을 포함하여 커널 코드에서 소비 한 17 cstime CPU 시간 
22 starttime jiffies로 측정 된 프로세스가 시작된 시간

jiffie는 클럭 틱이다. 또한 sysconf(_SC_CLK_TCK)시스템의 Hertz (초당 틱 수)를 얻기 위해 다양한 방법을 사용합니다. 궁극적으로 다른 옵션을 사용한 후 대체로 100을 사용합니다.

따라서 utime1234이고 Hertz가 100이면 다음과 같습니다.

seconds = utime / Hertz = 1234 / 100 = 12.34

실제 계산은 다음에 의해 수행됩니다.

total_time = utime + stime

IF include_dead_children
    total_time = total_time + cutime + cstime
ENDIF

seconds = uptime - starttime / Hertz

pcpu = (total_time * 1000 / Hertz) / seconds

print: "%CPU" pcpu / 10 "." pcpu % 10

예 (사용자 정의 Bash 스크립트에서 출력) :

$ ./psw2 30894
System information
           uptime : 353,512 seconds
             idle : 0
Process information
              PID : 30894
         filename : plugin-containe
            utime : 421,951 jiffies 4,219 seconds
            stime : 63,334 jiffies 633 seconds
           cutime : 0 jiffies 0 seconds
           cstime : 1 jiffies 0 seconds
        starttime : 32,246,240 jiffies 322,462 seconds

Process run time  : 31,050
Process CPU time  : 485,286 jiffies 4,852 seconds
CPU usage since birth: 15.6%

ps로 "현재" 부하 계산

이것은 (비트?) 그늘진 노력이지만 괜찮습니다. 가자.

제공된 시간을 ps사용하고 이것으로부터 CPU 사용량을 계산할 수 있습니다 . 그것에 대해 생각할 때 실제로 약간 유용하지만 다소 제한적일 수 있습니다.

이것은 오랜 기간 동안 CPU 사용량을 계산하는 데 유용 할 수 있습니다. 즉 plugin-container, 일부 Firefox 관련 작업을 수행하는 동안 Firefox 의 평균 CPU로드를 모니터링한다고 가정합니다 .

다음의 출력을 사용하여 :

$ ps -p -o cputime, 시간

CODE    HEADER   DESCRIPTION
cputime TIME     cumulative CPU time, "[DD-]hh:mm:ss" format.  (alias time).
etime   ELAPSED  elapsed time since the process was started, [DD-]hh:]mm:ss.
etimes  ELAPSED  elapsed time since the process was started, in seconds.

내가 사용 etime을 통해 etimes계산을 만 좀 더 명확하게하기 위해,이 샘플에. 또한 "fun"에 % cpu를 추가합니다. 즉, bash 스크립트에서 분명히 사용 etimes하거나 더 잘 읽을 수 있습니다 /proc/<PID>/.

Start:
$ ps -p 30894 -o %cpu,cputime,etime,etimes
%CPU     TIME     ELAPSED ELAPSED
 5.9 00:13:55    03:53:56   14036

End:
%CPU     TIME     ELAPSED ELAPSED
 6.2 00:14:45    03:56:07   14167

Calculate times:
            13 * 60 + 55 =    835   (cputime this far)
3 * 3,600 + 53 * 60 + 56 = 14,036   (time running this far)

            14 * 60 + 45 =    885   (cputime at end)
3 * 3,600 + 56 * 60 +  7 = 14,167   (time running at end)

Calculate percent load:
((885 - 835) / (14,167 - 14,036)) * 100 = 38

이 기간 동안 프로세스는 CPU 사용 시간의 38 %를 사용했습니다.

코드를 봐

어떻게 ps그것을 알고 작은 C 를 알고 싶다면 (Gnome Debain deriavnt를 실행하는 것처럼 보입니다)-주석과 관련하여 코드에서 좋은 태도를 취하십시오.

apt-get source procps
cd procps*/ps
vim HACKING

에 대한 자세한 정보 top와 지속적인 모니터링 에 대한 정보를 업데이트 하거나 ps현재 CPU로드와 함께 " " 지연 적으로 " "로 스냅 할 수 있습니다.
Runium

2
정말 좋은 답변입니다!
Theodor

전체 시스템에서 총 CPU 사용량을 계산할 때는 어떻습니까? 도구가 스냅 샷을 통해 CPU 사용량을 얻거나 시간이 지남에 따라 평균을 계산하려고합니까?
CMCDragonkai

4
man top

%CPU  --  CPU usage
The  task's share of the elapsed CPU time since the last screen update, expressed as a percentage of total CPU time.  In a true SMP environment, if 'Irix
mode' is Off, top will operate in 'Solaris mode' where a task's cpu usage will be divided by the total number of CPUs.  You toggle  'Irix/Solaris'  modes
with the 'I' interactive command.


man ps 
%cpu       %CPU    cpu utilization of the process in "##.#" format. Currently, it is the CPU time used divided by the time the process has been running                       (cputime/realtime ratio), expressed as a percentage. It will not add up to 100% unless you are lucky. (alias pcpu).

흠 그래 난 그 (즉시 CPU 비율)에서 얻는 방법을 궁금해ps
Theodor

2
당신은 최고 예로부터 추출 할 수 있습니다top -p 3343 -n1 | awk '/ R /{print $10}'
라훌 파틸에게

1
대박. 그 발견 awk다음에 대한 보내고 pid같이 더 나은 일top -p 3343 -n1 | awk '/ 3343 /{print $10}'
테오도르

1
감사합니다 "top -p"가 좋았습니다.이 옵션은 눈치 채지 못했습니다! 그러나 PID를 검색하는 것을 좋아하지 않습니다. 우연히 같은 숫자가 사용 가능한 메모리 섹션이나 다른 곳에 나타납니다. 내 시스템에서 정보는 8 번째 줄과 9 번째 열에 있습니다.top -p $PID -n1 | awk '{if (NR ==8) print $9 }'
phil_w
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.