2.1 Utilization과 run queue
CPU 분석은 전체 평균보다 core별 사용률과 실행 대기 task를 함께 봅니다.
mpstat -P ALL 1
vmstat 1
cat /proc/loadavg
cat /proc/pressure/cpu
mpstat의 %usr, %sys, %iowait, %steal은 서로 다른 경로를 가리킵니다. %sys 증가는 system call, network, filesystem 활동과 연결하고, virtual machine의 %steal은 hypervisor에서 CPU를 받지 못한 시간인지 확인합니다.
vmstat의 r은 실행 중이거나 실행 가능한 process 수입니다. 지속적으로 CPU 수보다 크고 CPU PSI도 증가하면 scheduler queue에서 기다리는 workload가 있다는 증거가 됩니다. 짧은 spike는 batch나 parallel query처럼 정상일 수 있습니다.
PostgreSQL과 연결
SELECT wait_event_type, wait_event, count(*)
FROM pg_stat_activity
WHERE state = 'active'
GROUP BY 1, 2
ORDER BY 3 DESC;
Active backend가 많고 wait event가 비어 있으며 CPU run queue가 길다면 CPU-bound query를 의심합니다. IO wait가 많다면 CPU 사용률보다 storage 경로를 먼저 봅니다.
확인 순서
- host가 실제로 CPU 포화인지 확인합니다.
- 특정 core만 포화인지 확인합니다.
- 어떤 process와 thread가 CPU를 쓰는지 찾습니다.
- cgroup quota와 throttling을 확인합니다.
- workload 증가인지 code path 변화인지 비교합니다.
CPU 수는 host의 logical CPU와 container가 사용할 수 있는 CPU가 다를 수 있습니다. nproc, cpuset, cpu.max를 함께 확인합니다.