CPU 사용량, 어떻게 측정될까?

모니터링에서 가장 기본적이고 중요한 지표 중 하나는 CPU 사용량입니다. 와탭 역시 이 핵심적인 지표를 지원하고 있는데요. 그렇다면 CPU 사용량 지표는 무엇을 의미하며, 이 데이터는 어떻게 생성되고 관리될까요? 이번 글에서는 CPU 데이터의 원리와 관리 방식을 자세히 살펴보겠습니다.
/proc/stat
Linux 시스템에서 /proc/stat 파일은 CPU 사용량, 시스템 부하, 프로세스 통계 등 다양한 시스템 성능 정보를 제공하는 가상 파일입니다. 특히 CPU 사용량 정보는 시스템 모니터링과 성능 분석에 필수적인 데이터를 제공합니다.
/proc/stat 파일의 역할과 구조
/proc/stat 파일은 가상 파일 시스템(procfs)의 일부로, 시스템과 프로세스 관련 통계 정보를 제공합니다. 이 파일을 읽으면 현재 시스템 상태를 반영한 최신 정보를 얻을 수 있죠. 파일 내용은 아래와 같이 구성되어 있습니다.
cpu 4705 150 2154 136239 0 0 0 0 0 0각 필드의 의미
- user: 사용자 모드에서 실행된 시간 (nice 값을 제외한)
- nice: 낮은 우선순위(nice)로 실행된 사용자 모드에서의 시간
- system: 커널 모드에서 실행된 시간
- idle: 유휴 상태에서 소비된 시간
- iowait: I/O 작업 완료를 기다리는 시간
- irq: 하드웨어 인터럽트를 처리하는 시간
- softirq: 소프트웨어 인터럽트를 처리하는 시간
- steal: 가상화 환경에서 다른 OS에 의해 소비된 시간
- guest: 게스트 OS에서 실행된 시간
- guest_nice: 낮은 우선순위로 실행된 게스트 OS에서의 시간
우리는 이 지표 중 user가 몇 %인지 알고 싶습니다. 그러나 /proc/stat에서 제공되는 지표는 %가 아닌 4705와 같은 숫자 형태로 나타나며, 이는 비율이 아닌 특정 단위를 나타냅니다. 어떤 단위를 의미하는걸까요?
CPU 사용자(user) 데이터의 생성 과정
1. 프로세스의 상태에 따른 시간 누적
프로세스가 실행될 때 커널은 프로세스의 실행 모드에 따라 적절한 시간 카운터를 증가시킵니다. 사용자 모드에서 실행되면 user 카운터가 증가하게 됩니다.
2. /proc/stat에 데이터 반영
- 커널은 내부적으로 유지하는 CPU 시간 누적 정보를
/proc/stat파일을 통해 사용자 공간에 제공합니다. - 파일을 읽을 때마다 커널은 현재 누적된 CPU 시간 값을 출력합니다.
- 이러한 데이터는 시스템 부팅 이후의 누적된 값이므로, 특정 기간의 CPU 사용량을 계산하려면 이전 값과의 차이를 비교해야 합니다.
CPU 사용자 데이터의 업데이트 주기
타이머 틱(Timer Tick) 기반 업데이트
- CPU 시간 카운터는 타이머 틱이 발생할 때마다 업데이트됩니다.
- 따라서 HZ 값에 따라 업데이트 주기가 결정됩니다.
Linux 커널에서의 CPU 시간 추적
1. 타이머 틱과 HZ 값
Linux 커널은 타이머 틱을 통해 CPU 시간을 추적합니다. 타이머 틱은 일정한 주기로 발생하는 인터럽트로, 커널은 이를 사용하여 프로세스 스케줄링, 시간 계산, CPU 시간 누적 등을 수행합니다.
- HZ 값: 타이머 틱의 주기를 결정하는 값으로, 일반적으로 100Hz, 250Hz, 1000Hz 등이 사용됩니다.
HZ 값 확인 방법:
grep CONFIG_HZ /boot/config-$(uname -r)위 명령어를 통해 현재 시스템의 HZ 값을 확인할 수 있습니다.
2. CPU 상태 추적 메커니즘
커널은 프로세스가 실행되는 동안 해당 프로세스의 상태에 따라 CPU 시간을 누적합니다.
- 사용자 모드(user mode): 일반 애플리케이션이 실행되는 모드.
- 커널 모드(kernel mode): 시스템 콜이나 커널 내부 작업이 실행되는 모드.
- 각 프로세스는 현재 실행 중인 모드에 따라 해당 CPU 시간 카운터가 증가합니다.
실제 데이터 생성 예시
1. CPU 시간 누적 과정
- 프로세스 실행: 사용자 모드에서 프로세스가 실행됩니다.
- 타이머 틱 발생: 일정 주기마다 타이머 틱 인터럽트가 발생합니다.
- 시간 카운터 증가: 현재 프로세스의 실행 모드에 따라
user또는 다른 카운터를 증가시킵니다. - 누적된 시간 저장: 이러한 과정이 반복되어 각 카운터에 누적된 시간이 저장됩니다.
2. /proc/stat 파일 출력
- 파일을 읽을 때마다 현재 누적된 각 CPU 시간 카운터의 값을 출력합니다.
-
user카운터에 누적된 값은 시스템 부팅 이후 사용자 모드에서 소비된 총 시간입니다.
CPU 사용률 계산
이제 /proc/stat에서 보이는 데이터가 어떤 데이터인지 알았습니다. 그렇다면 실제로 % 값은 어떻게 계산될까요? 먼저 /proc/stat의 CPU 시간은 누적 값이므로, 일정 간격으로 값을 읽어 차이를 계산해야 합니다. 예를 들어, 1초 간격으로 user 값을 읽고 두 값의 차이를 계산하여 해당 기간 동안의 사용자 모드 CPU 사용 시간을 구합니다.
퍼센트 계산을 위해서는 모수가 되는 값이 필요합니다. 모수는 total로, system, user, io wait, nice 등 모든 카운터의 차이를 합산한 값입니다. total 또한 동일한 간격으로 값을 읽어 차이를 계산합니다. 이를 통해 사용자 모드 CPU 사용률은 (delta_user / delta_total) * 100으로 계산할 수 있습니다.
- CPU 사용률 계산 예시:
# 첫 번째 읽기
cat /proc/stat | grep '^cpu ' > cpu_stat1
sleep 1
# 두 번째 읽기
cat /proc/stat | grep '^cpu ' > cpu_stat2
# 두 파일에서 필요한 필드를 추출하여 차이를 계산
# delta_user = user2 - user1
# delta_total = (user2 + nice2 + system2 + ... ) - (user1 + nice1 + system1 + ... )
# CPU 사용률 계산
CPU_usage = (delta_user / delta_total) * 100마무리
CPU 사용량을 측정하는 것은 시스템 성능과 안정성을 유지하는 데 핵심적인 작업입니다. /proc/stat파일의 데이터를 활용하면 시스템 부팅 이후 누적된 사용자 모드 CPU 시간을 기반으로 일정 간격의 데이터 차이를 계산하여 CPU 사용률을 산출할 수 있습니다. 이 과정에서 타이머 틱과 HZ 값의 개념을 이해하면 더욱 정확한 분석이 가능하며, 이를 통해 실시간 모니터링 시스템을 구축할 수 있습니다. CPU 사용량 지표는 단순한 숫자 이상의 의미를 가지며, 이를 효과적으로 활용하면 시스템 성능 최적화와 문제 진단에 중요한 통찰을 제공할 수 있습니다.

