top과 ps는 동일한 CPU 결과를 표시하지 않습니다.

top과 ps는 동일한 CPU 결과를 표시하지 않습니다.

이것은에 대한 링크입니다이것질문.

이것을 실행하면 top다음과 같은 결과를 얻습니다.

여기에 이미지 설명을 입력하세요.

pid는 303818%의 CPU를 사용하지만 실행 중일 때

여기에 이미지 설명을 입력하세요.

결과는 5.5%이다. 그리고 이 숫자는 시간이 지나도 변하지 않는 것 같습니다(즉, 나중에 동일한 명령을 실행할 때)...

ps명령은 어떤 방식으로든 CPU 사용량을 평균합니까?

답변1

man ps일부 NOTES.

   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%입니다.

주다: ps주어야 한다면실시간 CPU 사용량0% 또는 100%입니다.

top반면에 폴링 수를 유지하고 일정 기간 동안의 부하를 계산합니다.

ps현재 사용량을 제공하는 것은 가능하지만 이를 위해서는 데이터를 여러 번 읽고 각 읽기 사이에 절전 모드를 유지해야 합니다. 그러나 실제로는 그렇지 않습니다.

ps %cpu 계산

ps다음과 같이 CPU 사용량을 계산합니다.

가동 시간 = 시스템이 실행되는 총 시간입니다.
ps_time = 시작 이후 프로세스 시작 시간(초)입니다.
pu_time = 프로세스가 CPU를 사용한 총 시간입니다.

;; 프로세스가 실행된 시간(초):
초 = 가동 시간 - ps_time
;;용법:
cpu_usage = pu_time * 1000/초

인쇄: cpu_usage/10". CPU 사용량 % 10


예: 가동 시간 = 344,545 ps_time = 322,462 pu_time = 3,383 초 = 344,545 - 322,462 = 22,083 CPU 사용량 = 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/.

CPU 사용량을 계산할 때 ps다음 두 파일을 사용합니다.

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

순간시계가 똑딱거리는 소리입니다. 따라서 추가로 sysconf(_SC_CLK_TCK)시스템의 헤르츠(초당 틱)를 얻기 위해 다양한 방법을 사용합니다. 결국 다른 옵션을 모두 사용한 후 대체 수단으로 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-containerFirefox 관련 작업을 수행하는 동안 Firefox의 평균 CPU 로드를 모니터링하려고 합니다.

다음 출력을 사용하여:

$ ps -p -o CPU 시간, 시간

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.

좀 더 명확하게 설명하기 위해 이 예에서는 계산에 etimeover를 사용하고 있습니다. etimes또한 "재미"를 위해 %cpu를 추가했습니다. IE 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% 사용했습니다.

코드를 보세요

그것이 어떻게 완료되었는지 알고 싶고 psC에 대해 조금 알고 싶다면 그냥 하십시오(Gnome Debain deriavnt를 실행하는 것처럼 보입니다). 코드는 주석 등에 대해 좋은 태도를 가지고 있습니다.

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

답변2

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).

관련 정보