/Linux_LoadAverage

리눅스의 평균 부하 및 CPU 사용률에 대해 이해하기 위한 시나리오 구성

⛳ Linux의 평균 부하(Load Average)에 대해 이해하기

🎨 개요

리눅스 시스템에서의 서버 성능 관리와 CPU 과부하 상황에서의 문제 해결력을 키우기 위해 실습을 진행합니다.
평균 부하와 CPU 사용률에 대한 차이를 이해하고 모니터링하는 방법과 부하 테스트 방법을 익히는 것을 목표로 합니다.


👨‍👨‍👧‍👦💻 팀원

@최영하 @허예은



시스템이 느릴 때, top이나 uptime 명령어로 시스템의 부하를 확인할 수 있다.

$ uptime
02:34:03 up 2 days, 20:14,  1 user,  load average: 0.63, 0.83, 0.88
# 현재 시각, 시스템의 가동 시간, 로그인한 사용자 수, 지난 1분/5분/15분 동안의 평균 부하

여기서 🚨 평균 부하 🚨란?

  • 특정 시간 동안 실행 가능한 상태(Runnable)나 중단 불가능한(Uninterruptible) 상태에 있는 프로세스의 평균 수
  • 활성 프로세스의 평균 수라고도 하며, CPU 사용률과는 직접적으로 관련이 없다.

Runnable(실행 가능한)과 Uninterruptible(중단 불가능한) 상태

  • 실행 가능한 프로세스
    • CPU를 사용하고 있거나 CPU 사용을 기다리고 있는 프로세스를 의미
    • ps 명령어에서 R 상태로 표시된다.
  • 중단 불가 상태의 프로세스
    • 주로 I/O 작업을 기다리는 프로세스로, 이 상태에서는 프로세스가 중단될 수 없다.
    • ps 명령어에서 D 상태로 표시된다.

즉, 평균 부하는 실행 중이거나 CPU 또는 I/O를 대기 중인 활성 프로세스의 수를 나타낸다.


⚓ 평균 부하와 CPU 사용률의 차이

Case 1. CPU 집약적 작업이 많을 경우

  • CPU 사용률과 평균 부하가 모두 높음

Case 2. I/O 작업 대기 중인 프로세스가 많을 경우

  • CPU 사용률은 낮지만 평균 부하는 높을 수 있음
  • 많은 프로세스가 CPU 대신 I/O 작업을 기다리고 있기 때문

📃 시스템의 평균 부하를 평가하는 방법

uptime 명령어를 통해 나타나는 평균 부하 값을 어떻게 해석해야 할까?

평균 부하의 이상적인 상황은 CPU 수와 같을 때이다. 즉, 각 CPU가 완전히 사용되고 있지만, 과부하 없이 적절히 일해야 한다는 뜻이다.

따라서 평균 부하를 평가할 때 가장 먼저 알아야 할 것은 시스템에 몇 개의 CPU가 있는지이다. 이는 top 명령어로 확인할 수 있으며, /proc/cpuinfo 파일을 읽어서도 알 수 있다.

 $ grep 'model name' /proc/cpuinfo | wc -l
 2  # CPU 개수

이때, 평균 부하가 CPU 수를 초과할 때 시스템이 과부하 상태에 있다고 판단할 수 있다. 그렇다면 세 가지 평균 부하 값 중에서 어떤 것을 참고해야 할까?

사실, 세 가지 값을 모두 고려해 시스템 부하의 추세를 분석해야 한다.

Case 1. 1분, 5분, 15분 값이 비슷하거나 크게 차이가 나지 않는 경우

  • 시스템 부하가 안정적이라는 것을 의미

Case 2.간격 간 차이가 심한 경우

  • 1분 값이 15분 값보다 훨씬 낮다면, 최근 1분 동안 부하가 감소했으며, 지난 15분 동안은 상당한 부하가 있었음을 나타냄
  • 반대로 1분 값이 15분 값보다 훨씬 높다면, 최근 1분 동안 부하가 증가했음을 의미
  • 1분 평균 부하가 CPU 수에 근접하거나 이를 초과할 때, 시스템이 과부하 상태에 있음을 의미하며, 이 시점에서 문제의 원인을 분석하고 최적화할 필요가 있음

만약 1.73, 0.60, 7.98이라는 평균 부하를 가진 단일 CPU 시스템을 본다면, 이는 지난 1분 동안 시스템이 73% 과부하 상태에 있었고, 지난 15분 동안에는 698% 과부하 상태에 있었다는 것을 나타낸다. 하지만 전체적인 추세는 시스템 부하가 감소하고 있음을 보여준다.


평균 부하에 대한 다양한 시나리오

🚩 시나리오 1. CPU 집중적인 프로세스

개요: CPU 집중적인 작업이 시스템의 평균 부하에 미치는 영향을 나타내는 시나리오

  1. stress 명령어로 CPU에 인위적인 부하를 발생

image

  • -cpu 2: 두 개의 CPU 코어에 부하를 발생시킴
  • -timeout 300: 300초(5분) 동안 부하를 유지함
  1. 2개의 CPU에게 stress 테스트

image

  • 사용률이 100% 가까이 나오는 것을 확인함

image

  • 1분의 부하를 주었고 uptime 명령어로 1분, 5분, 15분 단위로 부하가 표시됨

결과: 2 core이므로 2에 가까울수록 CPU 평균부하가 100%에 가까운 것을 확인할 수 있음


🚩 시나리오 2. CPU I/O stress 테스트

개요: 디스크 I/O가 과하게 발생해도 CPU의 평균 사용률을 높일 수 있음을 확인하는 시나리오

  1. I/O에 부하를 줌

image

  • stress 명령어를 실행하지만 sync 명령도 계속 실행해서 I/O에 부하를 줌
  1. I/O stress 테스트

image image

  • 1분 동안 평균 부하가 천천히 1.15으로 증가하는 것을 볼 수 있음
  • 한 CPU의 시스템 CPU 사용률은 16.67%로 상승하고, iowait는 58.13% 에 도달
  • 이는 평균 부하의 증가가 iowait 상승이 원인임을 알 수 있음

image

결과: 어떤 프로세스가 높은 iowait을 가지고 오는지, 그리고 stress 프로세스가 높은 %wait를 발생시키는 것을 확인할 수 있음

🚩 시나리오 3. 시스템의 Core 수보다 더 많은 프로세스가 실행되는 경우

개요: 프로세스 수가 CPU의 처리 용량을 초과한 경우의 시나리오

  1. 시스템에서 실행 중인 프로세스 수가 CPU의 처리 용량을 초과하면, CPU를 기다리는 프로세스가 발생한다. 여전히 stress를 사용하지만 이번에는 8개의 프로세스를 시뮬레이션 실행 image

시스템에는 2개의 CPU만 있기 때문에, 8개의 프로세스는 CPU 수보다 훨씬 많아 CPU가 심하게 과부하되며 평균 부하가 6.13에 도달

  1. 프로세스의 부하 상태를 재확인 image
  • 여기서 8개의 프로세스가 2개의 CPU를 두고 경쟁 중임을 확인할 수 있다.
  • 각 프로세스는 CPU를 기다리는 시간이 최대 77%에 달한다.(%wait 열로 표시됨)
  • 이처럼 CPU의 계산 용량을 초과하는 프로세스들은 결국 CPU 과부하를 초래하게 된다.

결과: 이는 프로세스 수가 CPU 처리 능력을 초과할 때 시스템에 미치는 영향을 설명하며, CPU 대기 시간이 길어지는 것을 확인할 수 있다.


🖥️ 어느 정도의 평균 부하부터 주의해야 할까?

평균 부하가 CPU 수의 70%를 초과할 때 높은 부하 문제를 분석하고 조사해야 한다.

하지만 이는 절대적인 기준 값은 아니며, 더 많은 과거 데이터를 기반으로 부하의 추세를 판단하는 것이 좋다.

  • 높은 평균 부하는 CPU 사용률이 높은 프로세스로 인해 발생할 가능성이 크다.
  • 높은 평균 부하가 반드시 높은 CPU 사용률을 의미하는 것은 아니며, I/O 활동 증가를 나타낼 수도 있다.
  • 높은 부하를 발견했을 때는 mpstat, pidstat와 같은 도구를 사용하여 부하의 원인을 분석하여 높은 부하를 발생시키는 프로세스를 종료하거나 cpu 자원을 추가로 확보해야한다.

🎥 부하 원인 분석 도구

  • mpstat: CPU의 실시간 사용량을 분석하는 도구로, CPU가 얼마나 바쁜지 확인할 수 있다.
  • pidstat: 특정 프로세스의 CPU, 메모리, I/O 사용량을 확인할 수 있다.
  • stress: CPU 또는 I/O에 부하를 걸어 시스템을 테스트할 수 있다.

📌 결론

평균 부하는 시스템 성능을 빠르게 파악할 수 있는 유용한 지표이다. 하지만, 평균 부하만으로는 시스템의 병목 지점이나 문제 원인을 알 수 없으므로 추가적인 도구(mpstat, pidstat 등)를 사용해 부하 원인을 분석하는 것이 중요하다. CPU 사용률이 높지 않더라도 I/O 또는 프로세스 대기 상황에서 평균 부하가 높을 수 있다는 점을 유의해야 한다.


📎 참고 문헌

Deep Understanding of Average Load in Linux