매번 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.