Linux에서 전체 CPU 사용량 (예 : 57 %)을 얻는 방법 [닫기]


197

예를 들어 bash를 사용하여 시스템 CPU 사용량을 가져 와서 백분율로 표시하는 방법이 궁금합니다.

샘플 출력 :

57%

코어가 둘 이상인 경우 평균 백분율을 계산할 수 있으면 좋을 것입니다.


1
@julesanchez 값을 다른 곳에 파이프해야하기 때문에 int 여야합니다.
user1199739

top> myfile.txt 그리고 후 처리에서 필터를 적용해도 괜찮지 않습니까?
JuSchz

11
sysstat가 필요없는 명령 :ps -A -o pcpu | tail -n+2 | paste -sd+ | bc
RFon

7
다시 열기 나는 이것이 주제가 아닌 것으로 판명 된 이유를 이해하지 못하는데 , 그것을 닫은 사람들은 정교하게 신경 써야 할까?
Jonathan H

3
나의 이해 /proc/stat는 매우 제한적이지만,이 하나의 라이너는 저에게 충분히 효과적 cat <(grep 'cpu ' /proc/stat) <(sleep 1 && grep 'cpu ' /proc/stat) | awk -v RS="" '{printf "%.2f%\n", ($13-$2+$15-$4)*100/($13-$2+$15-$4+$16-$5)}'입니다. % .2f를 사용하면 출력하려는 ​​소수 자릿수를 제어 할 수 있으며 sleep 1평균 이상으로 시간을 설정할 수 있습니다. 즉, 내가 생각하는 것을 수행합니다. bash while 루프에 넣어 실시간으로 테스트 할 수 있습니다.
Yeti

답변:


174

보세요 cat /proc/stat

grep 'cpu ' /proc/stat | awk '{usage=($2+$4)*100/($2+$4+$5)} END {print usage "%"}'

편집하다 복사하여 붙여 넣기 전에 또는 중요한 작업에 사용하기 전에 주석을 읽으십시오. 이것은 테스트되거나 사용되지 않았으며, 유틸리티를 설치하지 않으려는 사람들이나 배포판에서 작동하는 것을 생각합니다. 어떤 사람들은 당신이 무엇이든 "설치 설치"할 수 있다고 생각합니다.

참고 : 이것은 아닙니다 현재 CPU 사용량이 아니라 시스템 부팅 이후 모든 코어의 전체 CPU 사용량입니다. 이것은 현재 CPU 사용량과 매우 다를 수 있습니다. 현재 값을 얻으려면 상단 (또는 유사한 도구)을 사용해야합니다.

현재 CPU 사용량은 다음을 사용하여 잠재적으로 계산할 수 있습니다.

awk '{u=$2+$4; t=$2+$4+$5; if (NR==1){u1=u; t1=t;} else print ($2+$4-u1) * 100 / (t-t1) "%"; }' \
<(grep 'cpu ' /proc/stat) <(sleep 1;grep 'cpu ' /proc/stat)

12
그러나 위에서 권장 한대로 mpstat를 설치해야합니다. 많은 사람들이 그러한 유연성을 가지고 있지 않습니다. cat / proc / stat 다음 파이프는 권장하는 mpstat보다 훨씬 쉽습니다.
vimdude

12
+1 왜 다른 유틸리티를 파싱하는 것이 파싱하는 것보다 낫는지 이해하지 못합니다/proc/stat
Reinstate Monica Please

9
시스템 + 사용자 + 유휴 = 100 % grep 'cpu'/ proc / stat | awk '{cpu_usage = ($ 2 + $ 4) * 100 / ($ 2 + $ 4 + $ 5)} END {print cpu_usage "%"}'
vimdude

106
이 솔루션에는 현재 CPU 부하가 아니라 CPU가 시작된 이후의 평균 CPU 부하가 표시된다고 생각합니다.
Etienne

11
@jlliagre, 네 맞습니다. CURRENT CPU 사용량을 평균이 아닌 값으로 계산하려면 1 달러 값을 취한 다음 지연 한 다음 1 달러 값을 가져 와서 차이를 확인해야합니다. 이것이 현재 CPU 사용량입니다.
vimdude

102

당신은 시도 할 수 있습니다:

top -bn1 | grep "Cpu(s)" | \
           sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | \
           awk '{print 100 - $1"%"}'

11
이 명령을 실행할 때마다 정확히 동일한 출력 ( 32.7%)을 얻습니다 .
alanaktion

13
를 사용할 때 더 정확한 결과가 제공 top -bn2되지만 시간이 오래 걸립니다. 내가 읽은 것에서 이것은 정확한 결과를 얻는 유일한 방법 인 것 같습니다.
alanaktion

7
top -bn1FC20 시스템에서 매우 부정확 한 것으로 보입니다. top -bn2잘 작동하는 것 같습니다.
Martin Tournoij

24
이 답변의 명령은 top -v반환 시스템 procps-ng(예 : Fedora)에 대해 작성된 것으로 보입니다 . 도 있는데 procps, 명령이없는 작업을 수행 예를 들어, 우분투와에 CentOS는, (구문 분석하지 못하기 때문에 항상 인해 CPU 수치가 다르게 포맷되고있는 행에 100 %를 나타냅니다)에서 발견했다. 다음은 두 가지 구현 모두에서 작동하는 버전입니다.top -b -n2 -p 1 | fgrep "Cpu(s)" | tail -1 | awk -F'id,' -v prefix="$prefix" '{ split($1, vs, ","); v=vs[length(vs)]; sub("%", "", v); printf "%s%.1f%%\n", prefix, 100 - v }'
mklement0

2
참고 : OSX에서는 다음을 사용하십시오 top -l 2 -n 0 -F | egrep -o ' \d*\.\d+% idle' | tail -1 | awk -F% -v prefix="$prefix" '{ printf "%s%.1f%%\n", prefix, 100 - $1 }'..
mklement0

38

패키지 mpstat에서 시도sysstat

> sudo apt-get install sysstat
Linux 3.0.0-13-generic (ws025)  02/10/2012  _x86_64_    (2 CPU)  

03:33:26 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
03:33:26 PM  all    2.39    0.04    0.19    0.34    0.00    0.01    0.00    0.00   97.03

그런 다음 일부 cut또는 grep필요한 정보를 구문 분석하십시오.

mpstat | grep -A 5 "%idle" | tail -n 1 | awk -F " " '{print 100 -  $ 12}'a

1
나는이 쇼에게 총 CPU 믿지 않는다
user1199739

나는 그것을 (%에서) 총 CPU 사용량의 100- %의 유휴 말하고 싶지만
피터 스벤손

"사용하지 않은"백분율입니다. 이 답변은 grep | 꼬리 | awk 부분 ...
jordanm

나는 awk부분을 ​​다음 awk -F " " '{print (100 - $12)"%"}'과 같이 변경 했다 : , 원하는대로 출력 형식을 지정하지만 그렇지 않으면 나에게 좋아 보인다.
Dan Fego

1
@jordanm 모든 진실; 나는 그것이 작동하기 때문에 더 투표했다. 나는 이것을 개인적으로 할 것이다 :mpstat | awk '$12 ~ /[0-9.]+/ { print 100 - $12 }'
Dan Fego

22

Peter Liljenberg의 아이디어에서 영감을 얻은 내 솔루션으로 실제 응답을 던질 수도 있습니다.

$ mpstat | awk '$12 ~ /[0-9.]+/ { print 100 - $12"%" }'
0.75%

이것은 awk12 번째 필드 (유휴)에서 100을 빼고 그 뒤에 백분율 기호를 인쇄하는 데 사용 됩니다. awk12 번째 필드에 숫자와 점만있는 줄 ( $12 ~ /[0-9]+/)에 대해서만이 작업을 수행합니다 .

1 초 간격으로 5 개의 샘플을 평균화 할 수도 있습니다.

$ mpstat 1 5 | awk 'END{print 100-$NF"%"}'

다음과 같이 테스트하십시오.

$ mpstat 1 5 | tee /dev/tty | awk 'END{print 100-$NF"%"}'

14
"mpstat 2 1 | ..."을 실행하여 마지막 1 초 동안의 통계를 표시하는 것이 좋습니다. 그렇지 않으면, 기본적으로 mpstat는 시작 이후 통계를 표시하며 시간이 지남에 따라 그다지 변경되지 않습니다
Sarang

1
"mpstat | awk '$ 12 ~ /[0-9.]+/ {print 100-$ 11"% "}'"이것은 저에게 효과적입니다.
AloneInTheDark

@ 사랑 감사합니다 !! 마지막으로 conky표시되는 결과도 얻을 수 있습니다. 불행히도이 라인은 매우 느리고 실행하는데 거의 1 초가 걸린다.
syntaxerror

6
@syntaxerror 명령을 보면 첫 번째 인수가 간격이라는 것을 알 수 있기 때문에 정확히 2 초가 걸리지 만 두 번째 인수 때문에 한 번만 실행되므로 결과를 반환 할 때까지 2 초 동안 기다립니다.
Johan Bjäreholt

질문이 마감되었으므로 내 (유사한) 답변을 귀하에게 추가했습니다 :-) 희망하지 마십시오. 당신처럼, 나는 Peter Liljenberg의 대답에서 영감을 받았습니다.
PJ Brunet

16

편집 : 다른 사용자의 회신에서 % idle이 필드 11 대신 필드 12라는 것을 알았습니다. awk가 변수 % idle 필드를 설명하도록 업데이트되었습니다.

원하는 출력을 얻을 수 있습니다.

mpstat | awk '$3 ~ /CPU/ { for(i=1;i<=NF;i++) { if ($i ~ /%idle/) field=i } } $3 ~ /all/ { print 100 - $field }'

간단한 정수 반올림을 원하면 printf를 사용할 수 있습니다.

mpstat | awk '$3 ~ /CPU/ { for(i=1;i<=NF;i++) { if ($i ~ /%idle/) field=i } } $3 ~ /all/ { printf("%d%%",100 - $field) }'

2
mpstat 1 1 | awk '$3 ~ /CPU/ { for(i=1;i<=NF;i++) { if ($i ~ /%idle/) field=i } } $3 ~ /all/ { printf("%d",100 - $field) }'고마워요. 1 1은 CPU 사용량이 두 번째에 걸쳐 샘플링되는 것을 보장하기 위해 mpstat의주의
chrishiestand

1
jq가있는 경우 : mpstat -o JSON -u 1 1 | jq '.sysstat.hosts[0].statistics[0]["cpu-load"][0].idle'
nyet
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.