리눅스 장애 대응 · 부하와 CPU · 실습
부하와 CPU 진단
목표
부하 평균이 무엇을 세는지 직접 확인하고, CPU 사용률·PSI·스로틀링 카운터를 함께 읽어 "지표가 정상인데 느린" 상황을 설명할 수 있게 만듭니다.
왜 중요한가
리눅스의 부하 평균은 CPU 대기만 세지 않습니다. 디스크나 NFS 응답을 기다리는 D 상태 태스크도 함께 셉니다. 그래서 8코어 서버의 로드가 24 인데 CPU 유휴가 60% 인 상황이 정상 동작입니다. 그때 CPU 를 늘리는 것은 돈만 쓰는 일입니다. 반대로 컨테이너의 cgroup 스로틀링은 로드에도, steal 에도, 사용률에도 나타나지 않습니다 - 스로틀당한 태스크는 런큐에서 아예 빠지기 때문입니다. 그래서 cpu.stat 의 카운터를 따로 봐야 합니다. 이 실습에서 "없으면 없다고 적어라"까지 채점하는 이유는, 현장에서도 그 파일의 존재 여부 확인이 첫 동작이기 때문입니다.
단계
/root/load 디렉터리에서 작업합니다.
1. 이 환경의 CPU 개수를 /root/load/cpus.txt 에 숫자만 적으세요.
2. CPU 를 계속 쓰는 프로세스를 2개 이상 백그라운드로 띄우고 PID 를 /root/load/burner_pids.txt 에 한 줄에 하나씩 적으세요. 이후 단계 내내 살아 있어야 합니다.
3. 1~2분 기다린 뒤 /proc/loadavg 의 1분 평균을 /root/load/load1.txt 에 적으세요. 0.7 이상이어야 합니다.
4. 그 프로세스들의 현재 상태 글자 한 개를 /root/load/state.txt 에 적으세요.
5. 첫 번째 프로세스의 누적 CPU 시간(초) 을 /root/load/cpu_sec.txt 에 정수로 적으세요. 5초 이상이어야 합니다.
6. /proc/pressure/cpu 의 some 줄에서 avg10 값을 /root/load/psi.txt 에 적으세요. 파일이 없으면 unavailable 이라고 적으세요.
7. cgroup 의 cpu.stat 에서 nr_throttled 값을 /root/load/throttle.txt 에 nr_throttled=<값> 형식으로 적으세요. 읽을 수 없으면 unavailable 이라고 적으세요.
8. /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번에서 부하를 만드는 프로세스를 먼저 정리해 버리면 판정 테스트가 실패합니다.
단계 8개
- CPU 개수 확인
- CPU 태우는 프로세스 띄우기
- 부하 평균 오르는 것 확인
- 프로세스 상태 글자 읽기
- 누적 CPU 시간 재기
- PSI 압박 지표 읽기
- cgroup 스로틀링 카운터
- 부하 판정 스크립트