본문

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

작성일 2024년 11월 25일

180dcd04e1ba7201a03cb3ce279ce0b1_1732498800_7394.jpg
 

모니터링에서 가장 기본적이고 중요한 지표 중 하나는 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 시간 누적 과정


  1. 프로세스 실행: 사용자 모드에서 프로세스가 실행됩니다.
  1. 타이머 틱 발생: 일정 주기마다 타이머 틱 인터럽트가 발생합니다.
  1. 시간 카운터 증가: 현재 프로세스의 실행 모드에 따라 user 또는 다른 카운터를 증가시킵니다.
  1. 누적된 시간 저장: 이러한 과정이 반복되어 각 카운터에 누적된 시간이 저장됩니다.

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 사용량 지표는 단순한 숫자 이상의 의미를 가지며, 이를 효과적으로 활용하면 시스템 성능 최적화와 문제 진단에 중요한 통찰을 제공할 수 있습니다.

정규석[email protected]
DevOps TeamDevOps Engineer

지금 바로
와탭을 경험해 보세요.