Diagnosing Load and CPU
한국어 원문으로 표시합니다.
목표
부하 평균이 무엇을 세는지 직접 확인하고, CPU 사용률·PSI·스로틀링 카운터를 함께 읽어 "지표가 정상인데 느린" 상황을 설명할 수 있게 만듭니다.
왜 중요한가
리눅스의 부하 평균은 CPU 대기만 세지 않습니다. 디스크나 NFS 응답을 기다리는 D 상태 태스크도 함께 셉니다. 그래서 8코어 서버의 로드가 24 인데 CPU 유휴가 60% 인 상황이 정상 동작입니다. 그때 CPU 를 늘리는 것은 돈만 쓰는 일입니다. 반대로 컨테이너의 cgroup 스로틀링은 로드에도, steal 에도, 사용률에도 나타나지 않습니다 - 스로틀당한 태스크는 런큐에서 아예 빠지기 때문입니다. 그래서 cpu.stat 의 카운터를 따로 봐야 합니다. 이 실습에서 "없으면 없다고 적어라"까지 채점하는 이유는, 현장에서도 그 파일의 존재 여부 확인이 첫 동작이기 때문입니다.
단계
/root/load 디렉터리에서 작업합니다.
- 이 환경의 CPU 개수를
/root/load/cpus.txt에 숫자만 적으세요. - CPU 를 계속 쓰는 프로세스를 2개 이상 백그라운드로 띄우고 PID 를
/root/load/burner_pids.txt에 한 줄에 하나씩 적으세요. 이후 단계 내내 살아 있어야 합니다. - 1~2분 기다린 뒤
/proc/loadavg의 1분 평균을/root/load/load1.txt에 적으세요. 0.7 이상이어야 합니다. - 그 프로세스들의 현재 상태 글자 한 개를
/root/load/state.txt에 적으세요. - 첫 번째 프로세스의 누적 CPU 시간(초) 을
/root/load/cpu_sec.txt에 정수로 적으세요. 5초 이상이어야 합니다. /proc/pressure/cpu의some줄에서avg10값을/root/load/psi.txt에 적으세요. 파일이 없으면unavailable이라고 적으세요.- cgroup 의
cpu.stat에서nr_throttled값을/root/load/throttle.txt에nr_throttled=<값>형식으로 적으세요. 읽을 수 없으면unavailable이라고 적으세요. /root/load/loadcheck.sh <임계비율>을 만드세요.1분 부하 평균 / CPU 개수가 임계비율을 넘으면high load=<값> cpus=<개수>를 출력하고 종료 코드 1, 넘지 않으면ok와 종료 코드 0. 인자가 없으면 0이 아닌 코드입니다.
참고
python3 -c "while True: pass" &로 CPU 를 태울 수 있습니다./proc/<PID>/stat의 필드는pid (comm) state ...순이고, 14번째와 15번째가 utime/stime(clock tick)입니다.awk 'BEGIN {exit (a/b > t) ? 1 : 0}'형태로 bc 없이 소수 비교가 됩니다.- 흔한 실수 1: 3번에서 부하를 만들자마자 읽으면 값이 낮습니다. 지수감쇠 평균은 1분 뒤에도 63% 만 반영됩니다.
- 흔한 실수 2: 8번에서 부하를 만드는 프로세스를 먼저 정리해 버리면 판정 테스트가 실패합니다.
CPU 개수 확인
이 환경의 CPU 개수를 /root/load/cpus.txt 에 숫자만 적으세요.
nproc 이 가장 간단합니다. 부하 평균은 이 숫자와 나란히 놓아야 뜻이 생깁니다.
CPU 태우는 프로세스 띄우기
CPU 를 계속 쓰는 프로세스를 2개 이상 백그라운드로 띄우고 PID 를 /root/load/burner_pids.txt 에 한 줄에 하나씩 적으세요. 이후 단계 내내 살아 있어야 합니다.
무한 루프를 도는 python3 프로세스 두 개면 됩니다. PID 를 한 줄에 하나씩 적으세요.
부하 평균 오르는 것 확인
1~2분 기다린 뒤 /proc/loadavg 의 1분 평균을 /root/load/load1.txt 에 적으세요. 0.7 이상이어야 합니다.
지수감쇠 평균이라 즉시 오르지 않습니다. 1~2분 기다렸다가 /proc/loadavg 의 첫 번째 값을 읽으세요.
프로세스 상태 글자 읽기
그 프로세스들의 현재 상태 글자 한 개를 /root/load/state.txt 에 적으세요.
/proc//stat 의 세 번째 필드가 상태입니다. CPU 를 계속 쓰는 프로세스는 어떤 글자일까요.
누적 CPU 시간 재기
첫 번째 프로세스의 누적 CPU 시간(초) 을 /root/load/cpu_sec.txt 에 정수로 적으세요. 5초 이상이어야 합니다.
/proc//stat 의 utime 과 stime 을 더하고 clock tick(보통 100)으로 나눕니다.
PSI 압박 지표 읽기
/proc/pressure/cpu 의 some 줄에서 avg10 값을 /root/load/psi.txt 에 적으세요. 파일이 없으면 unavailable 이라고 적으세요.
/proc/pressure/cpu 의 some 줄에 avg10 이 있습니다. 파일이 없으면 unavailable 이라고 적으세요.
cgroup 스로틀링 카운터
cgroup 의 cpu.stat 에서 nr_throttled 값을 /root/load/throttle.txt 에 nr_throttled=<값> 형식으로 적으세요. 읽을 수 없으면 unavailable 이라고 적으세요.
cpu.stat 에 nr_periods 와 nr_throttled 가 있습니다. 읽을 수 없으면 unavailable 입니다.
부하 판정 스크립트
/root/load/loadcheck.sh <임계비율> 을 만드세요. 1분 부하 평균 / CPU 개수 가 임계비율을 넘으면 high load=<값> cpus=<개수> 를 출력하고 종료 코드 1, 넘지 않으면 ok 와 종료 코드 0. 인자가 없으면 0이 아닌 코드입니다.
부하 평균을 코어 수로 나눈 비율을 임계값과 비교합니다. bc 없이 awk 로도 소수 비교가 됩니다.