지식이 늘었다/C,C++

[Linux] CPU 사용량/사용률 구하기

moneydeveloper 2022. 9. 8. 10:59
반응형

CPU 사용량을 실시간으로 계산해야 하는 경우가 생겨 전체 CPU 사용량 계산하는 방법에 대해서 알아보도록 하겠습니다. 

 

  1. CPU 사용량 구하기

단순 명령어를 통해 CPU 사용량을 바로 알 수는 있습니다. top, ps 라던지 많은 명령어가 존재합니다.

top 예시

이러한 명령어를 통해 바로 cpu 사용량을 알수는 있지만 경우에 따라서 직접 구현하여 해당 값을 가져와야 하는 경우가 있습니다.  cpu 사용량을 구하기 위해서는 /proc/stat 에 대한 이해가 필요합니다. 해당 파일에 대한 설명과 간단한 소스코드를 알아보도록 하겠습니다. 

 

1) /proc/stat

먼저 /proc/stat 가 어떤 값이 저장되어있는지 눈으로 확인해보겠습니다.

$ cat /proc/stat
cpu  19 0 99 119510 10 0 24 0 0 0
cpu0 0 0 13 7435 4 0 23 0 0 0
cpu1 0 0 1 7475 3 0 0 0 0 0
cpu2 0 0 23 7454 1 0 1 0 0 0
cpu3 0 0 5 7472 0 0 0 0 0 0
cpu4 0 0 25 7453 0 0 0 0 0 0
cpu5 1 0 0 7478 0 0 0 0 0 0
cpu6 1 0 12 7466 0 0 0 0 0 0
cpu7 0 0 0 7479 0 0 0 0 0 0
cpu8 0 0 5 7476 0 0 0 0 0 0
cpu9 7 0 1 7473 0 0 0 0 0 0
cpu10 0 0 3 7477 0 0 0 0 0 0
cpu11 0 0 0 7478 0 0 0 0 0 0
cpu12 0 0 1 7475 0 0 0 0 0 0
cpu13 0 0 0 7478 0 0 0 0 0 0
cpu14 10 0 10 7461 0 0 0 0 0 0
cpu15 0 0 0 7475 0 0 0 0 0 0
intr 13948 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
ctxt 47895
btime 1660025072
processes 281
procs_running 1
procs_blocked 0
softirq 18520 0 3262 0 63 0 0 9087 3327 0 2781

여러가지 값들이 많이 보입니다만 저희가 사용할 값은 숫자 몇개일뿐입니다. 

proc(5) — Linux manual page

우리가 사용할 값은 user, nice, system, idle 값입니다. 여기서 해당 값을 모두 더하면 cpu 전체값 이 됩니다. 

cpu[#] 의 값을 통해 각 코어별로 사용량을 구할 수 있고 전체 사용량은 cpu 에 해당하는 값을 사용하면 됩니다.

 

그래서 우리는 특정 시간 마다 해당 값의 변화량을 통해 cpu 사용량을 측정 할 수 있게 됩니다.

여기에서 idle 의 값은 아무것도 하지 않은 시간을 나타내기 때문에 전체 값의 변화량에서 idle 값의 변화량을 빼면 cpu 사용량을 구할 수 있게 됩니다. 정리하자면 아래와 같습니다. 

cpu 사용량 : 100 * ( 1.0 - (idel 변화량 / 전체 변화량  )

위와 같은 식을 얻을 수가 있습니다. 해당 식을 소스 코드로 구현 해보도록 하겠습니다. 

 

2) c++ 소스 코드 보기

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

struct stJiffies
{
        int user;
        int nice;
        int system;
        int idle;
};

int main(void)
{
        FILE *pStat = NULL;
        char cpuID[6] = {0};

        stJiffies curJiffies;
        stJiffies prevJiffies;

        while(1)
        {
                pStat = fopen("/proc/stat", "r");
                fscanf(pStat, "%s %d %d %d %d", cpuID, &curJiffies.user,
                        &curJiffies.nice, &curJiffies.system, &curJiffies.idle);

                stJiffies diffJiffies;
                diffJiffies.user =  curJiffies.user - prevJiffies.user;
                diffJiffies.nice =  curJiffies.nice - prevJiffies.nice;
                diffJiffies.system =  curJiffies.system - prevJiffies.system;
                diffJiffies.idle =  curJiffies.idle - prevJiffies.idle;

                int totalJiffies = diffJiffies.user + diffJiffies.nice + diffJiffies.system + diffJiffies.idle;

                printf("Cpu usage : %.2f%%\n", 100.0f * ( 1.0-(diffJiffies.idle / (double) totalJiffies) ) );

                prevJiffies = curJiffies;
                fclose(pStat);
                sleep(1);
        }
        return 0;
}

* 실행 결과

3) 정리

프로파일링 작업을 할 경우에 cpu 사용량 확인은 꼭 필요합니다. cpu 를 가져오지 못해 연산을 진행하지 못하는 경우가 있기 때문입니다. 이럴 경우 cpu 사용량을 확인 하지 않았다면 자신의 짠 소스 코드만으로는 해결방안을 찾지 못할 것이기 때문입니다. 꼭 해당 내용 참고하셔서 프로파일링 작업을 하시는 분들에게 도움이 되셨으면 합니다.

 

 

 

반응형