CPU 비율을 카운터로 얻는 방법은 무엇입니까?

CPU 비율을 카운터로 얻는 방법은 무엇입니까?

총 CPU 사용률을 카운터로 모니터링하고 싶습니다. 내가 카운터로 사용하려는 이유는 샘플 간에 데이터가 손실되지 않기 때문입니다(그리고 플로팅 측에서 비율을 계산하도록 할 수 있음).

나의 초기 접근 방식은 /proc/uptime공식을 사용하는 것이었습니다 (uptime-(idle_time/num_core))*100. 이는 일반적으로 많은 수의 서버(약 98%)에서 정확해 보이지만 때로는 잘못된 결과가 나타나는 것 같습니다. 예를 들어, 다음은 부정적인 CPU 사용량을 나타내는 것처럼 보이지만 실제로는 의미가 없습니다.

[root@ny-lb05 ~]# echo -e "scale=10\n ($(cut -f1 -d' ' /proc/uptime)-($(cut -f2 -d' ' /proc/uptime)/16))*100" | bc
5646895.3750000000
[root@ny-lb05 ~]# echo -e "scale=10\n ($(cut -f1 -d' ' /proc/uptime)-($(cut -f2 -d' ' /proc/uptime)/16))*100" | bc
5646891.5625000000

이 서버에서 나는 다음을 실행하고 있습니다.

Linux ny-lb05.ds.stackexchange.com 2.6.32-431.11.2.el6.x86_64 #1 SMP Tue Mar 25 19:59:55 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

이 계산에서 오류를 발견한 사람이 있나요? 카운터로 CPU 사용률을 얻는 더 좋은 방법이 있습니까?

고쳐 쓰다:
그래서 제가 추구하는 것은 단조롭게 증가하는 카운터로서의 총 사용 시간입니다. 총 활용률이 절대로 높지 않기를 바랍니다.줄이다. 그런데 아래와 같은 경우인 것 같습니다. [root@ny-lb05 ~]# read uptime idle </proc/uptime; echo -e "scale=1000\n ($uptime*16-($idle))" | bc 903874.23 [root@ny-lb05 ~]# read uptime idle </proc/uptime; echo -e "scale=1000\n ($uptime*16-($idle))" | bc 903870.29

또한 /proc/cpuinfo에 따르면 cores=siblings이므로 HT가 활성화되지 않은 것 같습니다.

업데이트 2:
너무 깁니다. /proc/uptime에 버그가 있습니다. 대신 /proc/stat를 사용하십시오.

답변1

(가동 시간-(idle_time/num_core))

시스템이 얼마나 오랫동안 사용되었는지(초 단위) 확인할 수 있습니다. 여기에 100을 곱하면 100분의 1초가 됩니다. 그게 의도인가요?

IMO는 총 프로세서 초 수를 고려하고 그에서 유휴 시간을 빼는 것이 더 합리적입니다.

uptime * num_core - idle_time = total active processor seconds

활용도 측정항목은 다음과 같습니다.

active seconds / (uptime * num_core)

예를 들어 시스템이 4개의 코어에서 10초 동안 실행되고 유휴 시간이 5초인 경우:

(10 * 4 - 5) / (10 * 4) = 0.875

가동률은 87.5%이다.

또는:

(10 - 5 / 4) / 10 = 0.875

마찬가지로 하나의 작업을 저장합니다.


카운터로 CPU 사용률을 얻는 더 좋은 방법이 있습니까?

시스템 진단 C++ 라이브러리에서 /proc/stat모든 코어의 합계인 첫 번째 줄을 구문 분석하여 이 작업을 수행합니다. 처음 세 개의 필드는 사용자 시간, 낮은 우선순위(양호라고도 함) 시간 및 시스템 시간입니다. 이들의 합은 활성 시간의 양입니다(여기서의 단위는 초가 아닙니다. /proc/stat아래 참조 man proc).

USER_HZ가 100이라고 가정하고 5초 이상 폴링하는 경우 는 total_a첫 번째 샘플(user + Nice + sys)이고 total_b는 두 번째 샘플입니다.

(total_b - total_a) / 5 / 100 / num_cores = usage ratio

여기에 100을 곱하면 5초 간격의 평균을 나타내는 백분율을 얻게 됩니다.

논리는 다음과 같습니다.

  • total_b - total_a= 샘플 간 활동 시간

  • 샘플 기간(5초)으로 나눕니다.

  • 초당 측정 단위(USER_HZ)로 나눕니다.

  • 코어 수로 나눈 값

USER_HZ는 거의 확실하게 100입니다. 확인해야 할 사항:

#include <stdio.h>
#include <unistd.h>

int main (void) {
    printf (
        "%ld\n", 
        sysconf(_SC_CLK_TCK)
    );

    return 0;
}

컴파일: gcc whatever.c, 실행 ./a.out.

쉘 도구를 사용하여 정확한 지속 시간을 얻는 것은 어렵습니다. 따라서 총 활성 시간 측정을 늘리거나(내 생각에는 이것이 귀하의 의도라고 가정함) 상당히 긴 간격(예: 30초 이상)을 사용할 수 있습니다.

답변2

/proc/cputime두 개의 개별 프로세스에서 데이터를 읽고 있기 때문에 문제가 발생할 수 있습니다 . 각 시간 사이의 유휴 시간이 약간 증가하므로 cat두 번째 판독값이 낮아질 수 있습니다. 대신 다음을 수행하는 것이 좋습니다.

read uptime idle </proc/cputime
echo -e "scale=10\n ($uptime-($idle/16))*100" | bc

또한 결과를 총 활용률로 표시하려면 다시 가동 시간으로 나누어야 합니다.

read uptime idle </proc/cputime
echo -e "scale=10\n ($uptime-($idle/16))/$uptime*100" | bc

관련 정보