CPU 사용량을 실시간으로 계산해야 하는 경우가 생겨 전체 CPU 사용량 계산하는 방법에 대해서 알아보도록 하겠습니다.
- CPU 사용량 구하기
단순 명령어를 통해 CPU 사용량을 바로 알 수는 있습니다. top, ps 라던지 많은 명령어가 존재합니다.
이러한 명령어를 통해 바로 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
여러가지 값들이 많이 보입니다만 저희가 사용할 값은 숫자 몇개일뿐입니다.
우리가 사용할 값은 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 사용량을 확인 하지 않았다면 자신의 짠 소스 코드만으로는 해결방안을 찾지 못할 것이기 때문입니다. 꼭 해당 내용 참고하셔서 프로파일링 작업을 하시는 분들에게 도움이 되셨으면 합니다.
'지식이 늘었다 > C,C++' 카테고리의 다른 글
std::allocator / new, delete overloading 소개 및 활용 (0) | 2020.08.28 |
---|---|
fopen_s EINVAL return 에 대한 고찰 ( filename 관련 ) (0) | 2020.08.07 |