/ proc / stat를 한 번에 읽어 CPU 사용률을 계산하는 방법이 있습니까?


12

질문은 어떻게 든 / proc / stat를 한 번만 읽어 CPU 사용률을 계산할 수 있습니까?

# head -1 /proc/stat
cpu  67891300 39035 6949171 2849641614 118251644 365498 2341854 0

나는 IOWait (유휴 상태에서 계산되는 곳을 읽고 있음)를 제외하고 열을 요약하려고 생각하고 100 %를 줄 것이고 각 개별 열은 (column / 100_percent) * 100으로 백분율로 바뀔 수 있습니다.

  • 사용자 : 사용자 모드에서 실행되는 일반 프로세스
  • nice : 사용자 모드에서 실행되는 niced 프로세스
  • 시스템 : 커널 모드에서 실행되는 프로세스
  • 유휴 : twiddling thumbs
  • iowait : I / O가 완료되기를 기다리는 중
  • irq : 서비스 인터럽트
  • softirq : softirq 서비스
  • 훔치기 : 비자발적 대기
  • 손님 : 일반 손님을 실행
  • guest_nice : niced 게스트 실행

이것이 가능한 접근법입니까, 아니면 완전히 벗어났습니다.

답변:


11

당신은 올바른 길을 가고 있으며, top이 목적으로이 파일을 사용합니다. 그러나 한 번 이상 읽어야합니다.

사용률은 시간이 지남에 따라 사용되는 척도입니다. 호스트의 가동 시간 (초)을 알면 한 번 읽어서 나눌 수 있지만, 시스템 부팅 후 호스트의 유틸리티 속도를 제공합니다.

5 초 이상의 속도를 원하면 파일을 한 번 읽고 5 초 동안 잠자고 다시 읽고 계산의 차이를 얻은 다음 5로 나눕니다.


6

당신의 접근 방식이 맞습니다. / proc / stat를 원시 데이터로 사용하고 rrdtool과 같은 피드를 제공 할 수 있습니다. 나는 100 % 가능하다는 것을 알기 위해 이와 같은 것을 스스로 해왔다. 그런 다음 전체 시스템로드 또는 각 코어를 개별적으로 그래프로 표시 할 수 있습니다.

내 자신의 실제 예는 다음과 같습니다. 여기에 이미지 설명을 입력하십시오

다시 가정-> 당신은 그것을 할 수 있습니다, 그것은 기본적인 수학이 어렵지 않으며 내 그래프는 그 실제 예입니다. 데이터를 수집하기 위해 / proc / stat의 스냅 샷을 램 디스크에 현지화 된 임시 파일로 만든 다음 1 분마다 데이터를 수집하기 위해 해당 파일을 구문 분석합니다.

데이터를 구문 분석하는 방법 (bash 스크립트 조각) :

cat=/bin/cat # others defined the same way
......

$cat /proc/stat > /ramdisk/tmp/stat

ssCpuRawUser=`$cat /ramdisk/tmp/stat|$grep "cpu " | $awk '{print $2}'`
ssCpuRawNice=`$cat /ramdisk/tmp/stat|$grep "cpu " | $awk '{print $3}'`
    #other columns follow ....... 

#the most important there is that it is an incrementing COUNTER.
if [ ! -f ${data_dir}/sys.cpu.rrd ];then
        $rrdtool create ${data_dir}/sys.cpu.rrd -s 60 \
        DS:ssCpuRawUser:COUNTER:300:0:1250000 \
        DS:ssCpuRawNice:COUNTER:300:0:1250000 \
        DS:ssCpuRawSystem:COUNTER:300:0:1250000 \
        DS:ssCpuRawIdle:COUNTER:300:0:1250000 \
        DS:ssCpuRawIOwait:COUNTER:300:0:1250000 \
        DS:ssCpuRawIRQ:COUNTER:300:0:1250000 \
        DS:ssCpuRawSoftIRQ:COUNTER:300:0:1250000 \
            RRA:AVERAGE:0.5:1:532800

fi

$rrdtool update ${data_dir}/sys.cpu.rrd N:$ssCpuRawUser:$ssCpuRawNice:$ssCpuRawSystem:$ssCpuRawIdle:$ssCpuRawIOwait:$ssCpuRawIRQ:$ssCpuRawSoftIRQ

# then in a loop each core the same way until all are parsed.

당신이 rrd 데이터베이스에 데이터를 얻은 후 당신은 그래프와 하늘이 한계입니다 :) http://oss.oetiker.ch/rrdtool/doc/rrdgraph.en.html


데이터를 어떻게 파싱합니까?
ewwhite

@ewwhite-> 데이터를 구문 분석하는 방법을 보여주기 위해 답변을 편집했습니다.
Bartłomiej Zarzecki

아름다운 그래프! : 당신의 누락 된 열 주석에 관한 askubuntu.com/a/120961/451886을 . VM에서 실행중인 경우 "훔치기"카운터 일 수 있습니다.
rkagerer

rrdtool 및 램 디스크 +1!
shadi

4

oneliner를 원하면 다음과 같이 보일 수 있습니다.

echo $(echo '100'; echo $(echo '(';head -1 /proc/stat | awk '{print $5}'; sleep 1; echo '-';head -1 /proc/stat |  awk '{print $5}';echo ')/100') | bc -l) | bc -l

결과: 97.17000000000000000000

작동 방식 :

echo $(echo '(';head -1 /proc/stat | awk '{print $5}'; sleep 1; echo '-';head -1 /proc/stat |  awk '{print $5}';echo ')/100')

( 1055057784 - 1055058055 )/100그런 다음이 줄 바꿈을 bc로 생성합니다 . 와 같은 것을 갖게 -7.84000000000000000000되면 그냥 감싸서 100-$(value)bc에 다시 먹이십시오.

이 : sleep #- 일초 지연, 그런 다음 중간 결과가 초 단위로 나눌 수 있어야이 값을 변경합니다. $5- man prochttp://www.linuxhowtos.org/System/procstat.htm 에 따라 5 번째 필드

이것이 효과가없는 경우 알려주십시오.


0

또는 포인트 awk 이후에 두 자리 숫자만으로도 만족한다면 모든 것이 훨씬 간단하고 읽기 쉽습니다.

 awk -v oldidle=$(awk '/cpu / {print $5}' /proc/stat; sleep 1) '/cpu / {perc=100-($5-oldidle)/100 ; printf "%s", perc}' /proc/stat
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.