LabHub
배우기 러닝패스 코스

Linux Incident Response

Diagnosing Load and CPU

LabHub 에서 이어서 보기

한국어 원문으로 표시합니다.

목표

부하 평균이 무엇을 세는지 직접 확인하고, 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/loadavg1분 평균/root/load/load1.txt 에 적으세요. 0.7 이상이어야 합니다.
  4. 그 프로세스들의 현재 상태 글자 한 개를 /root/load/state.txt 에 적으세요.
  5. 첫 번째 프로세스의 누적 CPU 시간(초)/root/load/cpu_sec.txt 에 정수로 적으세요. 5초 이상이어야 합니다.
  6. /proc/pressure/cpusome 줄에서 avg10 값을 /root/load/psi.txt 에 적으세요. 파일이 없으면 unavailable 이라고 적으세요.
  7. cgroup 의 cpu.stat 에서 nr_throttled 값을 /root/load/throttle.txtnr_throttled=<값> 형식으로 적으세요. 읽을 수 없으면 unavailable 이라고 적으세요.
  8. /root/load/loadcheck.sh <임계비율> 을 만드세요. 1분 부하 평균 / CPU 개수 가 임계비율을 넘으면 high load=<값> cpus=<개수> 를 출력하고 종료 코드 1, 넘지 않으면 ok 와 종료 코드 0. 인자가 없으면 0이 아닌 코드입니다.

참고

CPU 개수 확인

이 환경의 CPU 개수를 /root/load/cpus.txt 에 숫자만 적으세요.

nproc 이 가장 간단합니다. 부하 평균은 이 숫자와 나란히 놓아야 뜻이 생깁니다.

CPU 태우는 프로세스 띄우기

CPU 를 계속 쓰는 프로세스를 2개 이상 백그라운드로 띄우고 PID 를 /root/load/burner_pids.txt 에 한 줄에 하나씩 적으세요. 이후 단계 내내 살아 있어야 합니다.

무한 루프를 도는 python3 프로세스 두 개면 됩니다. PID 를 한 줄에 하나씩 적으세요.

부하 평균 오르는 것 확인

1~2분 기다린 뒤 /proc/loadavg1분 평균/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/cpusome 줄에서 avg10 값을 /root/load/psi.txt 에 적으세요. 파일이 없으면 unavailable 이라고 적으세요.

/proc/pressure/cpu 의 some 줄에 avg10 이 있습니다. 파일이 없으면 unavailable 이라고 적으세요.

cgroup 스로틀링 카운터

cgroup 의 cpu.stat 에서 nr_throttled 값을 /root/load/throttle.txtnr_throttled=<값> 형식으로 적으세요. 읽을 수 없으면 unavailable 이라고 적으세요.

cpu.stat 에 nr_periods 와 nr_throttled 가 있습니다. 읽을 수 없으면 unavailable 입니다.

부하 판정 스크립트

/root/load/loadcheck.sh <임계비율> 을 만드세요. 1분 부하 평균 / CPU 개수 가 임계비율을 넘으면 high load=<값> cpus=<개수> 를 출력하고 종료 코드 1, 넘지 않으면 ok 와 종료 코드 0. 인자가 없으면 0이 아닌 코드입니다.

부하 평균을 코어 수로 나눈 비율을 임계값과 비교합니다. bc 없이 awk 로도 소수 비교가 됩니다.