Load Average & 스케줄러 진단
Load Average & 스케줄러 진단 정리
1. Load average 정의 실행 중(R 상태) + 실행 대기 중 + I/O 대기(D 상태) 프로세스 수의 지수 이동 평균. CPU만이 아니라 I/O 대기도 포함된다는 점이 중요합니다.
2. 상대적인 값 절대적인 높낮이 기준은 없으며 CPU 코어 수 기준으로 판단합니다. load average 4.0은 1코어면 포화 상태지만 4코어면 딱 적정 수준입니다.
3. 절대적으로 신뢰하면 안 된다 커널 버그(D 상태 계산 오류 등)로 실제와 다르게 튀는 사례가 있습니다. 진단 도구로 /proc/sched_debug를 쓸 수 있지만, Raspberry Pi처럼 CONFIG_SCHED_DEBUG=y임에도 파일이 없는 경우도 있습니다. 대안으로 /proc/schedstat, /proc/<pid>/sched를 활용합니다.
4. vmstat으로 원인 구분 load average가 높을 때 r과 b 열로 병목 원인을 구분합니다.
- r (런큐) 높음 → CPU 병목
- b (블락큐) 높음 → I/O 병목
5. /proc/sched_debug 진단 포인트
- nr_running — CPU별 런큐에 올라온 프로세스 수
- runnable tasks — 대기 중인 프로세스의 pid, vruntime, wait-time 상세 정보
6. /proc/schedstat 부팅 이후 누적 스케줄링 통계. run_ns, wait_ns, timeslices 3개가 핵심이며 wait_ns / run_ns 비율로 장기적인 스케줄링 경합도를 파악할 수 있습니다. 실시간 진단은 vmstat, 장기 경향은 /proc/schedstat으로 역할을 나눠 사용