Computer >> 컴퓨터 >  >> 프로그래밍 >> Ruby

시스템 부하와 부하 평균(Load Average), 제대로 이해하기

top, uptime, w 같은 명령어나 AppSignal의 호스트 메트릭에서는 부하 평균(load average)이라는 지표를 확인할 수 있습니다. 이 지표는 여러 시간 구간에 걸쳐 평균을 낸 값으로, 시스템이 얼마나 부하를 받았는지 알려줍니다.

$ uptime
10:14:14 up 60 days, 17:42,  1 user,  load average: 0.44, 0.28, 0.25

부하 평균은 보통 세 개의 숫자로 표시됩니다. 위 uptime 출력 결과 마지막의 세 숫자는 각각 최근 1분(0.44), 최근 5분(0.28), 최근 15분(0.25) 동안의 평균 부하를 의미합니다.

AppSignal에서는 최근 8시간까지는 분 단위로, 그보다 긴 기간에는 시간 단위로 부하 평균을 표시합니다.

시스템 부하란?

부하 평균이 무엇을 의미하는지, 그리고 언제 경계해야 하는지 이해하려면 먼저 '시스템 부하'가 무엇이고 어떻게 계산되는지 알아야 합니다.

시스템 부하는 특정 시점에 활성 상태인 프로세스의 개수입니다. 시스템이 유휴(idle) 상태일 때 부하는 0이며, 프로세스가 시작되면 1씩 증가하고 종료되면 1씩 감소합니다. 실행 중인 프로세스뿐 아니라 대기열에서 차례를 기다리는 프로세스도 함께 계산됩니다. 예를 들어 하나의 프로세스가 CPU를 사용 중이고 두 개가 대기 중이라면 부하는 3이 됩니다.

수명이 짧은 프로세스들 때문에 부하는 매우 빠르게 변동합니다. 밀리초 만에 0에서 5로 뛰었다가 다음 순간 다시 0으로 돌아갈 수도 있죠. 그래서 단발적인 수치보다는 일정 시간 동안의 평균 부하를 살펴보는 것이 시스템 전체의 부하 상태를 파악하는 데 훨씬 유용합니다.

부하 평균 읽는 법

시스템 부하의 계산 방식을 알았으니 이제 부하 평균을 살펴보겠습니다. 앞서 본 것처럼 시스템 부하는 보통 일정 시간의 평균값으로 표시됩니다.

일반적으로 싱글 코어 CPU는 한 번에 하나의 프로세스만 처리할 수 있습니다. 부하 평균이 1.0이면 해당 코어가 100% 바쁘게 작동했다는 뜻입니다. 반대로 0.5로 떨어졌다면 CPU가 시간의 50% 동안 유휴 상태였던 것입니다.

부하 평균이 1.5까지 올라갔다면 CPU가 계속 바쁜 상태였고, 평균적으로 시간의 50% 동안 하나의 프로세스가 추가로 대기하고 있었다는 의미입니다. 즉, CPU가 감당할 수 있는 양보다 더 많은 작업이 몰리고 있는 상황입니다.

논리 프로세서(Logical Processors)

경험상 부하 평균은 머신의 프로세서 수를 넘지 않는 것이 좋습니다. 프로세서가 네 개라면 부하는 일반적으로 4.0 미만을 유지해야 합니다.

여기서 주의할 점은 물리적 코어가 아니라 논리 프로세서 기준이라는 것입니다. 하이퍼스레딩(hyper-threading) 같은 소프트웨어 추상화 기술 때문에 논리 프로세서, 즉 처리 스레드의 수는 물리 코어 수보다 많을 수 있습니다.

Linux에서 논리 프로세서 수를 확인하려면 /proc/cpuinfo에 나열된 processor 항목을 직접 세거나, grep processor /proc/cpuinfo | wc -l 명령으로 개수를 자동으로 출력할 수 있습니다.

macOS에서는 sysctl -n hw.ncpu 명령으로 논리 프로세서 수를 바로 조회할 수 있습니다.

논리 프로세서가 여러 개인 시스템은 동시에 더 많은 프로세스를 실행할 수 있으므로 부하 평균이 더 높아질 수 있습니다. 듀얼 코어 머신에서 부하 평균 2.0은 두 CPU가 모두 100% 가동되었고, 평균 두 개의 프로세스가 활성 상태였음을 의미합니다.

👋 Ruby(Rails) 성능 관련 글이 더 궁금하다면 Ruby 성능 모니터링 체크리스트의 다른 아티클도 확인해 보세요.

부하 평균 해석과 경고 기준

부하 평균은 절대적인 프로세스 수의 평균이기 때문에 어느 정도가 적정한지, 언제 걱정해야 하는지 판단하기 어려워 보일 수 있습니다. 하지만 각 CPU 코어가 한 번에 하나의 프로세스를 처리한다는 점을 고려하면, 논리 프로세서당 1.0을 넘기 전까지는 시스템에 과부하가 걸린 것으로 보지 않습니다. 하이퍼스레딩이 없는 듀얼 코어 시스템이라면 기준치는 2.0입니다.

통상 최근 1분 부하 평균이 코어당 1.0을 살짝 넘는 정도라면 크게 문제가 되지 않지만, 5분 또는 15분 평균이 계속 높게 유지된다면 문제의 신호일 수 있습니다.

TIP: AppSignal의 이상 탐지(anomaly detection) 기능을 활용하면 부하 평균이 일정 값 이상으로 일정 기간 유지될 때 알림을 받을 수 있습니다. 워밍업(warm-up) 설정을 사용하면, 예를 들어 부하가 1.5를 넘은 상태로 15분간 지속될 때 메시지를 받도록 구성할 수 있습니다.

부하 평균에 대한 궁금증이 해소되셨나요? 아직 명확하지 않은 부분이 있다면 @AppSignal로 편하게 알려주세요. 이 글이 도움이 되었는지, 또는 더 알고 싶은 주제가 있다면 언제든 의견을 들려주세요.