매번 CPU 사용량이 동일합니다.


13

CPU 사용을 얻기 위해 다음 명령을 실행하면 멋진 + 사용자 CPU 사용이 발생합니다.

top -b -n1 | grep "Cpu(s)" | awk '{print $2 + $4}' 

산출:

14.5

여기서 문제는 출력이 top 명령에 의존하므로 top 명령으로 즉시 변경되지 않는다는 것입니다. 그래서 나는 즉시 올바른 CPU를 얻지 못했습니다. 동일한 출력을 제공하며 변경되지 않습니다.

출력에서 실시간 cpuusage를 얻고 싶습니다. 내 명령을 개선하도록 도와주세요.


1
그리고 질문은?
Dennis Kaarsemaker

앞에 붙은 명령을 실행하십시오 time. 내 시스템에서는 0.165 만 걸립니다.
depquid

편집 한 명령을주세요.
Ketan Patel

시도 :time (top -b -n1 | grep "Cpu(s)" | awk '{print $2 + $4}' )
depquid

다른 시스템에서 테스트 한 후 출력 차이가 없음
Ketan Patel

답변:


13

맞습니다 top. 처음 반복 할 때 잘못된 CPU 사용량을 나타내는 것으로 보입니다. 이 문제를 다음과 같이 해결할 수 있습니다.

top -b -n2 | grep "Cpu(s)"|tail -n 1 | awk '{print $2 + $4}'

이것은 물론 두 배의 시간이 걸리지 만 어쨌든 작동합니다.

그래도 더 빨리 작동하려면 -d옵션 을 사용할 수 있습니다 . 예를 들어 1 초 총 측정 기간 동안 절반을 사용하십시오.

top -d 0.5 -b -n2 | grep "Cpu(s)"|tail -n 1 | awk '{print $2 + $4}'

serverfault.com/a/436499/134517 또한 거의 1 초가 아닌 1 초 정도 걸리므로 시간이 두 배 이상 소요됩니다.
altendky

altendky의 의견 외에도, 왜 문제가 처음 에 있는지에 대한 설명 은 terdon의 답변을 참조하십시오 .
Ruslan

6

기술적으로 첫 번째 top가 항상 같은 값을 출력하지는 않습니다. 마지막 부팅 이후 평균 CPU로드 만 출력합니다. 때문에 top용도 델타 /proc/stat잘못된 (그러나 WAD) 결과를 얻었다 제로 대해 비교하면서 CPU 부하를 계산하기 위해 통계 첫번째 값이 계산된다.

을 사용하지 않으려면 top직접 구문 분석 할 수 있습니다 /proc/stat.

cat <(grep 'cpu ' /proc/stat) <(sleep 1 && grep 'cpu ' /proc/stat) | awk -v RS="" '{print ($13-$2+$15-$4)*100/($13-$2+$15-$4+$16-$5) "%"}'

이 방법으로 더 빠르고 정확합니다.

당신은 그것을 테스트 할 수 있습니다 stress:

stress -c 1 -q &

그리고 해

killall stress

후.


좋은. 명령이 'cpu'라는 파일에 있으면 다음 명령을 watch실행할 수 있습니다.watch -n1 "bash ./cpu"
Brent Faust

구문 분석 할 awk 스크립트 /proc/stat는 꽤 멋지지만 최상위 첫 번째 반복과 동일한 단점이있는 것처럼 보입니다. 현재 부팅이 아닌 마지막 부팅 이후 평균 CPU로드를 출력합니다.
pieroxy

5

@Ruslan의 답변을 확장하고 top사용자, 시스템 프로세스 및 nice프로세스 간에 CPU 사용량을 나누기 위해 세 가지 합계를 원합니다. 따라서 출력 모드를 파싱 할 수 top있는 batch 모드 에서 실행할 수 있습니다 . 그러나 여기 에서 설명한 것처럼 첫 번째 반복 반복은 top -b부팅 이후 백분율 을 반환하므로 -n 2현재 백분율을 얻으려면 적어도 두 번의 반복 ( )이 필요합니다 . 작업 속도를 높이기 d위해 반복 간격을 0.01다음과 같이 설정할 수 있습니다 .

top -bn 2 -d 0.01 | grep '^%Cpu' | tail -n 1 | gawk '{print $2+$4+$6}'

4

아마 ps출력을 기반으로 이것을 사용하십시오 :

ps aux  | awk 'BEGIN { sum = 0 }  { sum += $3 }; END { print sum }

0

쉘에서 watch 명령 또는 for 루프를 사용하십시오.

watch -n1 "top -b -n1 | grep 'Cpu(s)' | awk '{print \$2 + \$4}'"


시계와 함께 일어난 일
Ketan Patel

0

왜 CPU 사용량에 관심이 있습니까? 로드 평균은 훨씬 더 좋은 지표입니다 :

cat /proc/loadavg

실제로 CPU 사용량이 필요한 경우 구문 분석 /proc/stat이 가장 좋은 방법 일 것입니다.


1
로드 평균은 기본적으로 CPU 사용량의 시간 통합입니다 (시간으로 나눔). 왜 통합 특성이 완전히 다른 사용 사례를 가질 때 차이 특성보다 [모든 것의] 더 나은 지표라고 말하는가? 또한 /proc/statCPU 사용량을 그대로주지는 않습니다. 읽기 사이에 시간을두고 두 번 읽어야하고 CPU 사용량을 얻기 위해 계산을 수행해야합니다. 이것은 바로 그 일 top입니다.
Ruslan

나는 수학을 할 수 없으므로 적분과 미분의 차이를 실제로 이해하지 못한다는 것을 인정해야합니다 : / "부하 평균은 기본적으로 CPU 사용의 시간 적분입니다"-정말입니까? AFAIK 프로세스가 D 상태에서 중단되면로드가 증가하지만 CPU 사용량은 발생하지 않습니다. "왜 말을하겠습니까 ..."-OP는 그가 실제로 달성하고자하는 것을 말하지 않기 때문에 솔직히 말해서 시스템로드를 측정하고 CPU 사용량이 가장 좋은 지표라고 생각했습니다. 그래서 그에게 평균로드를 지시했습니다.
Martin von Wittich

링크에서 : "시스템은로드 평균을로드 번호의 지수 감쇠 / 가중 이동 평균으로 계산합니다." 그리고 "시스템 부하는 계산 작업량의 척도"입니다. D 상태는 계산 작업을 수행하지 않습니다. CPU 시간을 사용하는 프로세스가 필요합니다. 따라서 평균로드는 기본적으로 일정 시간 동안 CPU가 유휴 상태가 아닌 시간의 백분율입니다 (예 : 분에서 수십 분). CPU 사용률은 밀리 초 단위의 시간 단위로 CPU가 유휴 상태가 아닌 시간의 백분율입니다. 즉, 읽을 때마다 업데이트되고 현재 상태를 반영 합니다.
Ruslan

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.