LabHub
배우기 러닝패스 코스

Linux障害対応

負荷と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 로도 소수 비교가 됩니다.