top -b -n2 -d 1 | grep Cpu
나는 이것을 루프에서 실행하고 있으며 각 반복마다 두 개의 항목을 반환하는 것을 발견했습니다...
1) 각 루프마다 두 개의 결과 행이 있습니다. 첫 번째 행을 사용해야 합니까, 아니면 두 번째 행을 사용해야 합니까... 둘 사이의 차이점은 무엇입니까?
2) CPU 사용률을 계산하려면 %us, %sy, %ni, %hi 및 %si?를 추가하십시오.
Cpu(s): 1.6%us, 1.7%sy, 0.0%ni, 96.6%id, 0.0%wa, 0.0%hi, 0.1%si, 0.0%st
Cpu(s): 8.7%us, 9.4%sy, 0.0%ni, 81.9%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu(s): 1.6%us, 1.7%sy, 0.0%ni, 96.6%id, 0.0%wa, 0.0%hi, 0.1%si, 0.0%st
Cpu(s): 9.7%us, 8.9%sy, 0.0%ni, 81.5%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
답변1
@garethTheRed가 맞습니다. 두 번의 출력 반복을 요청하셨습니다.
"CPU 사용률"의 의미에 따라 다릅니다. 줄의 각 항목은 서로 다른 내용을 나타냅니다.
%us
사용자 모드에서 0 이상의 nice 값으로 처리하는 데 소요되는 시간입니다. 여기에는 대부분의 사용자 응용 프로그램이 수행하는 대부분의 작업이 포함됩니다.%sy
커널 모드에서 소요된 시간이며 다른 영역에 속하지 않습니다. 이는 주로 시스템 호출에 소요되는 시간입니다.%ni
0 미만의 nice 값을 가진 프로세스가 사용자 모드에서 보낸 시간입니다. 본질적으로 이는 백그라운드 작업입니다.%id
아무것도 하지 않을 시간이다. 100에서 다른 값의 합을 뺀 값과 같아야 합니다.%wa
다른 작업을 수행하지 않고 I/O가 완료될 때까지 기다리는 데 소요된 시간입니다. 여기에는 디스크에 데이터를 읽거나 쓰기 위해 대기하는 데 소요된 시간이 포함됩니다.%hi
하드웨어 인터럽트를 서비스하는 데 커널 모드가 걸리는 시간입니다. 대부분의 우수한 시스템에서 이 값은 0에 가까워야 합니다.%si
커널 모드 및 지연된 인터럽트(대부분의 시스템에서 이는 주로 네트워크 인터럽트임)에서 소프트웨어를 서비스하는 데 소요된 시간입니다.%st
시스템에서 무언가를 실행 중일 수 있지만 다른 가상 머신이 사용 중입니다. 가상 머신을 직접 실행하거나 EC2, GCE, DigitalOcean 또는 Linode와 같은 클라우드 호스팅 플랫폼에서 실행하지 않는 한 이 값은 0이어야 합니다. 이는 일부 시스템, 특히 이전 시스템이나 Linux가 아닌 시스템에서는 나타나지 않을 수 있습니다.
프로그래머가 아닌 대부분의 정의에 따르면 시스템의 CPU 사용률은 %us
, %sy
, 및 의 합계와 같습니다 %ni
(사실 이전 UNIX 시스템에서는 이러한 값만 표시했습니다). 보다 정확하게는 , %id
, 를 제외한 모든 값의 합과 같습니다 %wa
( %st
CPU는 실제로 이러한 상태에서 아무것도 하지 않기 때문입니다).
제공한 예제 행을 사용하면 두 번째 정의에 따른 활용률은 3.4%, 18.1%, 3.4%, 18.6%가 됩니다.
답변2
command = "top -bn 2 -d 0.01 | grep '^Cpu' | tail -n 1 | gawk '{print $2+$4+$6}'"
'''
The 1st iteration of top -b returns the percentages since boot.
We need at least two iterations (-n 2) to get the current percentage.
To speed things up, you can set the delay between iterations to 0.01.
top splits CPU usage between user, system processes and nice processes, we want the sum of the three.
Finally, you grep the line containing the CPU percentages and then use gawk to sum user, system and nice processes:
top -bn 2 -d 0.01 | grep '^Cpu' | tail -n 1 | gawk '{print $2+$4+$6}'
----- ------ ----------- --------- ----------------------
| | | | |------> add the values
| | | |--> keep only the 2nd iteration
| | |----------------> keep only the CPU use lines
| |----------------------------> set the delay between runs
|-----------------------------------> run twice in batch mode
'''