본문 바로가기

복사금지 블로그 짜증나서 만든 개발문서

리눅스 load average 정리 — CPU 사용률이 아니라 줄 선 프로세스 수입니다

반응형

환경  Linux 6.8 · 코어 2개 서버 기준 · 2026-09-04 확인

uptime 끝에 붙는 0.64, 0.29, 0.17 이 세 숫자는 사용률이 아닙니다. 무엇을 세는지, 왜 부하를 껐는데도 안 내려오는지, 코어 수로 어떻게 나눠 읽는지 실제 명령 결과와 함께 정리했습니다.

퍼센트가 아니라 줄 서 있는 프로세스를 센 값

load average 는 지금 CPU 를 쓰고 있거나 쓰려고 차례를 기다리는 프로세스와, 디스크 응답을 기다리느라 멈춰 선 프로세스를 함께 센 값입니다. 앞쪽이 실행 상태(R), 뒤쪽이 중단할 수 없는 대기 상태(D) 입니다.
그래서 이 값에는 천장이 없습니다. 사용률이라면 100 에서 멈추겠지만 이건 개수를 센 거라 200 도 나옵니다. 줄이 길어진 만큼 그대로 올라갑니다.
uptime 끝에 붙는 세 숫자가 그겁니다. 왼쪽부터 1분·5분·15분 평균이고, 원본은 /proc/loadavg 에 그대로 들어 있습니다.
파일에는 칸이 두 개 더 있습니다. 네 번째 칸의 슬래시 앞은 지금 실행 가능한 커널 스케줄링 단위 수, 뒤는 시스템에 존재하는 전체 수입니다. 다섯 번째는 가장 최근에 만들어진 프로세스의 PID 고요. 앞 세 숫자와 달리 이 둘은 평균이 아니라 찍은 순간의 값입니다.

uptime
#  02:15:03 up 9 days,  3:40,  0 users,  load average: 0.03, 0.12, 0.06

cat /proc/loadavg
# 0.03 0.12 0.06 1/259 578130
#  └─ 1분  └─ 5분  └─ 15분  └─ 실행가능/전체  └─ 최근 PID

앞 세 칸만 평균이고, 뒤 두 칸은 찍은 순간의 값입니다

얼마나 썼는지가 아니라 몇이 줄 서 있는지를 센 숫자입니다.

왜 지금 값을 그냥 주지 않고 굳이 평균을 내나

커널은 이 값을 5초에 한 번만 갱신합니다. 매 순간 세면 숫자가 튑니다. 프로세스 하나가 잠깐 깨어났다 자는 것만으로도 값이 요동치니, 화면을 보고 있는 사람에게는 쓸모가 없어요.
대신 구간을 셋으로 나눠 한꺼번에 줍니다. 하나만 보면 지금이 어느 국면인지 모르지만 셋을 나란히 놓으면 방향이 보입니다. 1분 값이 15분 값보다 크면 부하가 올라가는 중이고, 작으면 이미 지나간 겁니다.
코어가 두 개인 서버에 코어 하나를 계속 붙잡는 프로세스를 딱 하나 띄우고, 10초마다 세 값을 찍어 봤습니다. 시작은 완전히 놀고 있는 상태였습니다.
왼쪽만 뚜렷하게 오르고 가운데와 오른쪽은 거의 제자리입니다. 같은 사건이라도 창이 넓을수록 천천히 스며듭니다. 그래서 15분 값이 움직였다면 그건 방금 생긴 일이 아닙니다.

# 시작 상태: 0.00 0.13 0.11
nice -n 19 timeout 75 bash -c 'while :; do :; done' &
for i in $(seq 6); do sleep 10; echo "$((i*10))초  $(cut -d' ' -f1-3 /proc/loadavg)"; done

# 10초  0.16 0.16 0.12
# 20초  0.29 0.19 0.13
# 30초  0.40 0.22 0.14
# 40초  0.49 0.24 0.15
# 50초  0.57 0.27 0.16
# 60초  0.64 0.29 0.17

부하는 하나뿐인데 1분 값만 먼저 움직입니다

숫자가 굼뜬 이유는 평균이 아니라 감쇠라서

이름은 평균인데 계산은 평균이 아닙니다. 지난 1분치를 모아 나누는 게 아니라, 5초마다 새 표본을 조금씩 섞습니다. 새 값 = 옛 값 × e + 지금 개수 × (1 − e) 꼴이죠. 옛 값이 지워지지 않고 비율만 줄어든 채 계속 남습니다.
그래서 부하 1을 정확히 1분 걸어도 1분 평균은 1.00 이 되지 않습니다. 0 에서 출발했다면 1 − 1/e, 그러니까 0.63 근처에서 멈춥니다. 위 측정에서 60초에 0.64 가 찍힌 게 그 값입니다.
내려올 때도 속도가 같습니다. 부하를 껐다고 숫자가 뚝 떨어지지 않고, 1분이 지나야 3분의 1쯤 남습니다.
장애를 막 잡고 나서 uptime 을 쳐 보면 여전히 높게 나오는 이유가 이겁니다. 이 숫자는 지금을 보여주는 게 아니라 방금까지를 끌고 다닙니다. 조치가 먹혔는지 확인하려면 다른 걸 봐야 합니다.

# 위 부하를 멈춘 직후부터 20초마다
# 종료 후 20초  0.51 0.31 0.18
# 종료 후 40초  0.37 0.29 0.18
# 종료 후 60초  0.26 0.27 0.17

# 1분이 지나도 0 이 아니다. 0.64 의 3분의 1쯤이 남아 있다.

부하는 이미 없는데 숫자는 아직 내려오는 중입니다

1분 평균은 지난 1분의 평균이 아닙니다. 1분 전 일이 아직 3분의 1쯤 남아 있는 값입니다.

코어 수로 나눠야 비로소 뜻이 생긴다

숫자 하나만 놓고 높다 낮다를 말할 수 없습니다. 줄 선 프로세스를 세어 둔 값이니, 창구가 몇 개인지 같이 알아야 하니까요.
코어가 둘인 서버에서 2.00 이면 두 프로세스가 코어를 하나씩 차지하고 기다리는 쪽은 없는 상태입니다. 같은 2.00 이 코어 16개짜리에서는 한참 여유죠. 그러니 load 를 보기 전에 nproc 을 먼저 칩니다.
코어당 값으로 바꿔 두면 사양이 다른 서버끼리도 같은 자로 읽힙니다. 1.0 을 넘었다면 자리가 없어 기다리는 쪽이 생겼다는 뜻입니다.
다만 1.0 을 넘겼다고 바로 문제는 아닙니다. 야간 배치가 도는 시간대라면 그게 정상이죠. 평소 값을 알고 있어야 지금 값이 이상한지 아닌지 판단이 섭니다.

nproc
# 2

awk -v c="$(nproc)" '{printf "1분 %.2f / 코어당 %.2f\n", $1, $1/c}' /proc/loadavg
# 1분 0.27 / 코어당 0.14

나눠 두면 사양이 다른 서버도 같은 눈금으로 비교됩니다

CPU 사용률과 갈라지는 자리

top 에는 idle 이 99% 로 찍혀 있는데 load 만 높은 서버가 있습니다. 어느 한쪽이 틀린 게 아니라 세는 대상이 다릅니다. 디스크나 네트워크 저장소의 응답을 기다리며 멈춰 선 프로세스도 load 에 들어가니까요.
그 상태를 D 로 표시하고 중단 불가 대기라고 부릅니다. 신호를 보내도 깨울 수 없는 상태죠. 이런 프로세스는 CPU 를 한 톨도 쓰지 않으면서 load 만 밀어 올립니다.
그래서 load 가 높다는 이유로 코어를 늘리면 아무 일도 일어나지 않습니다. 병목이 저장장치 쪽이면 코어를 열 개 더 꽂아도 줄은 그대로예요. 손대기 전에 어느 쪽 줄인지부터 갈라야 합니다.
ps 로 D 상태 프로세스를 찾고, vmstat 의 r 과 b 두 칸을 같이 봅니다. r 은 실행을 기다리는 쪽, b 는 막혀서 서 있는 쪽입니다. b 가 계속 0 이 아니면 저장장치를 의심하면 됩니다.
맥에는 /proc 이 없어서 파일로는 못 봅니다. sysctl -n vm.loadavg 를 치면 { 1.26 1.31 1.32 } 처럼 중괄호에 담겨 나옵니다. 코어 수는 hw.ncpu 로 보고요.

ps -eo state,pid,comm --no-headers | awk '$1 ~ /^D/'
# (출력이 없으면 디스크에 걸린 프로세스가 없다는 뜻)

vmstat 1 3
# procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
#  r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
#  0  0 269056 226084 160300 1104468    1    1    14    34    2   20  1  0 99  0  0
#  0  0 269056 226084 160300 1104468    0    0     0     4  179  142  0  0 100  0  0
#  0  0 269056 226084 160300 1104468    0    0     0   704  163  136  0  0 99  1  0

맨 앞 r·b 두 칸이 load 가 세는 바로 그 줄입니다

CPU 를 늘려도 안 내려가는 load 가 있습니다. 그건 디스크가 세우고 있는 줄입니다.

조치 후 확인할 것

  • uptime 의 세 숫자를 나란히 놓고 방향부터 읽는다. 1분 값이 15분 값보다 크면 지금 올라가는 중이다
  • nproc 으로 코어 수를 확인하고 load 를 그 수로 나눈다. 나누기 전 숫자로는 높다 낮다를 말할 수 없다
  • CPU 사용률이 한가한데 load 만 높으면 ps -eo state 로 D 상태 프로세스가 있는지 본다
  • 부하를 방금 껐다면 1분 값은 아직 안 내려온다. 지금 상태는 vmstat 의 r·b 칸으로 확인한다
  • 맥에는 /proc/loadavg 가 없으니 sysctl -n vm.loadavg 로 본다

load average 는 서버가 얼마나 힘든지를 알려 주는 숫자가 아닙니다. 몇이 기다리고 있는지를 세어 둔 값이고, 그마저도 몇 분에 걸쳐 천천히 섞은 값이죠. 코어 수로 나눠 읽는 습관과 사용률과 갈라 보는 습관, 이 둘만 붙여 두면 갑자기 쓸모 있는 숫자가 됩니다.

반응형