최근에
삽질을 하다가인스턴스의 CPU사용량을 직접 개산해야되는 일이 생겨서 글을 써봅니다
혹시 개발하면서 모니터링을 툴을 사용해보신분들 많으신가요?
대표적으로 Node-Exporter혹은 AWS를 사용하시면 CloudWatch등을 Grafana로 연동해서 CPU사용량과 메모리 사용량들을 모니터링 해보셨을겁니다.
그렇게 해서 보이는 CPU사용량... 혹시 어떻게 보여주는건지 궁금해보신적 없으신가요?
심지어 Node-Exporter같은 경우 OS가 Linux가 아니면 안되는 경우도 많습니다.
도대체 왜 그럴까요?
리눅스를 기본적으로 배우신분들은 아시겠지만 프로세스 관련 정보를 리눅스는 /proc
디렉토리에 저장을 합니다.
그래서 리눅스에서 /proc
디렉토리에 들어가보시면 아주 많은 정보가 보입니다.
그리고 거기서 저희가 중요하게 볼 친구는 바로 /proc/stat
입니다.
Cpu관련 정보가 있는 파일이죠.
이 파일을 열어보면 대충 이런 데이터가 보입니다.
/proc$ cat stat
cpu 44775831 277913 39308233 3139867507 2331941 0 1871410 101461507 0 0
cpu0 22465392 134304 19654255 1569047332 1175219 0 957779 51221440 0 0
cpu1 22310439 143608 19653977 1570820174 1156722 0 913630 50240066 0 0
intr 6227015690 97 9 0 0 1171 0 2 0 0 0 0 33 15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16022981 15967263 0 441504461 500162583 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 26427104977
btime 1741194912
processes 21299609
procs_running 1
procs_blocked 0
softirq 5477800364 3 1505464447 15222 1054837291 627450 0 5737805 2217205769 59670 693852707
그래서 이게 뭔데 이 씹덕아
위 숫자들이 무엇을 뜻하고 숫자들을 이용해 계산하는 방법을 알려드리겠습니다.
방금 보여드린 숫자들을 한번 잘 살펴보도록 하겠습니다.
물론 다 설명 하기에는 너무 길고 귀찮고 짧게 알아봅시다.
cpu 44775831 277913 39308233 3139867507 2331941 0 1871410 101461507 0 0
cpu0 22465392 134304 19654255 1569047332 1175219 0 957779 51221440 0 0
cpu1 22310439 143608 19653977 1570820174 1156722 0 913630 50240066 0 0
저희가 집중할 부분은 위애서 3번의 줄 입니다.
자세히 살펴보면 cpu, cpu0, cpu1 관계가 보이실겁니다.
사실 cpu
로 시작하는 줄은 cpu1
과 cpu2
를 합친 숫자입니다.
cpu1
은 첫번째 코어에서 사용한 cpu 사용량이고 cpu2
는 두번째 코어에서 사용한 사용량이라고 생각하시면 편합니다.
저희는 총 cpu사용량을 계산 해야하기 때문에 첫번째 라인만 보면 됩니다.
오호?
다시 그러면 첫번째 라인을 봅시다.
cpu 44775831 277913 39308233 3139867507 2331941 0 1871410 101461507 0 0
그래서 저기에 적혀있는 숫자들은 뭔가요? 비트인가요?
아닙니다. 저 숫자들은 저희가 보통 지피 (Jiffies) 라고하는 시간 단위 입니다.
그리고 저기에 숫자가 중간에 나눠져 있는데 위치에 따라서 의미하는 숫자다 다릅니다.
첫번째 칸 (user:444775831) 은 유저 모드에서 실행된 normal 프로세스 시간
두번째 칸 (nice:277913) 은 유저 모드에서 실행된 nice 프로세스 시간
세번째 칸 (system:39308233) 은 커널 모드에서 실행된 프로세스 시간
네번째 칸 (idle:3139867507) cpu가 실행이 안된 시간 (논 시간)
다섯번째 칸 (iowait:2331941) io작업을 처리하기 위해 대기한 시간
여섯번째 칸은 (irq:0) 은 인터럽 처리인데 이건 무시 하셔도 되고
그 외 나머지 숫자들 (1871410, 101461507 0 0)은 저희가 지금 별로 신경 안써도 되서 괜찮습니다.
그래서 cpu사용량은 어떻게 계산하나요?
그냥 저기 보이는 숫자들중 idle만 빼고 다 더하면 됩니다.
네?
하지만 저희는 cpu 사용량을 보통 %로 표기를 하죠. 그거도 이제 저희가 특정 구간에서 cpu를 얼만크 사용했나를 보고싶어합니다.
그러면 저희는 proc/stat
에서 저 숫자들을 2번 (snapshot) 가지고 옵니다.
그리고 측정했을때 시간차이를 적습니다.
그 이후 아래와 같이 계산 하면 됩니다.
((total_2 - idle_2)-(total_1-idle_1))/(t_2-t_1)=cpu사용량
뭐 대충 저겁니다.
그래서 왜 저렇게 해야되나요?
저렇게 해야되는 제일 큰 이유는 proc/stat
에 보이는 데이터는 그 시간때에 사용량을 보여주는게 아니라 계속 늘어나는 숫자입니다. 즉 컴퓨터가 오래 켜져있었으면 숫자가 크겠죠?
그래서 그 차이를 계산해서 특정 구간에서 얼만큼을 사용했는지를 계산 해줘야합니다.
사실 저희가 이런걸 고민할일은 거의 없습니다. 에초에 대부분은 툴이나 라이브러리들이 알아서 저런걸 수집하고 계산해주거든요.
근데 일반인들은 이런걸 당연하게 봐도 저희와 같은 개발자들은 이런걸 알아우면 좋겠죠?
그리고 가끔 cpu수집 툴이 망가지만 직접 계산해야할때가 있습니다.
독자분들 곧 오는 추석 행복하게 보내시고 즐거운 코딩 되세요~