15강 / 20강

성능 지표 읽기 — 어디서 기다리고 있나

load average · %us %sy %wa %si · vmstat 로 병목 찍기

성능 지표 읽기 — 어디서 기다리고 있나
숫자 다섯 개만 읽을 줄 알면 병목의 90%를 찍어낼 수 있습니다.

사장님이 전화합니다. "쇼핑몰이 느려요."

여러분은 SSH로 접속합니다. 그리고 3분 안에 원인이 CPU인지, 메모리인지, 디스크인지, 네트워크인지 찍어야 합니다. 그 방법을 배웁니다.

진단 실습실 — 여러 가지 장애 상황을 골라 지표가 어떻게 바뀌는지 보고, 병목을 맞혀 보세요.
불러오는 중…

① load average — 줄 서 있는 사람 수

uptime이 보여 주는 세 숫자는 1분·5분·15분 평균입니다. "CPU 사용률"이 아니라 일하려고 기다리는 프로세스 수예요. 리눅스에서는 디스크를 기다리는 프로세스도 여기 포함됩니다.

load 를 CPU 수로 나눈 값이 진짜 지표입니다.
bash 브라우저에서 실행
load는 반드시 코어 수로 나눠서 읽습니다.
Python 브라우저에서 실행

② CPU 시간의 다섯 조각 — 여기가 핵심입니다

top의 %Cpu(s) 줄이 병목 진단의 가장 강력한 도구입니다.

칸뜻높으면 무슨 뜻인가
us사용자 코드 실행내 앱이 계산 중. 정상적인 바쁨. 코드나 코어를 봐야 함
sy커널 실행시스템 콜·문맥 교환이 과하다. 워커/스레드가 너무 많은가?
wa디스크를 기다리는 시간디스크 병목. CPU는 놀고 있다
si소프트 인터럽트네트워크 패킷 폭주. 13강 참고
id놀고 있음여기가 크면 CPU는 병목이 아니다
지금 이 서버의 CPU 시간 분포입니다.
bash 브라우저에서 실행

③ vmstat — 한 화면에 다 있다

vmstat 1은 관리자가 가장 많이 쓰는 명령입니다. 첫 줄은 부팅 후 평균이라 버리고, 두 번째 줄부터 읽어요.

r · b · si · so · wa 다섯 칸만 봐도 됩니다.
bash 브라우저에서 실행

읽는 순서는 이렇습니다.

  1. si/so 가 0인가? — 아니면 즉시 메모리 문제. 여기서 끝
  2. b 가 0인가? — 아니면 디스크를 기다리는 프로세스가 있다
  3. wa 를 본다 — 높으면 디스크 병목
  4. r 을 코어 수와 비교 — r > 코어 수면 CPU에 줄이 섰다
  5. cs 가 비정상적으로 큰가 — 문맥 교환 과다

직접 장애를 만들어 봅시다

stress-ng로 서버에 일부러 부하를 걸고, 지표가 어떻게 변하는지 확인합니다.

us 가 90%대로 올라갑니다. wa 는 그대로예요.
bash 브라우저에서 실행
이번엔 wa 가 올라갑니다. 같은 '느림'인데 원인이 다릅니다.
bash 브라우저에서 실행

④ 어느 프로세스가 범인인가

%CPU 와 RES 를 함께 봅니다.
bash 브라우저에서 실행

⑤ 진단 순서 요약

1. uptime          → load / 코어수 로 심각도 파악
2. vmstat 1 5      → si/so 로 메모리 문제부터 배제
3. top             → us / sy / wa / si 로 병목 종류 결정
4. iostat -x       → wa 가 높으면 어느 디스크인지
5. ps aux --sort=-%cpu | head → 범인 프로세스 특정
6. 로그 확인       → 언제부터, 무엇 때문에
이 한 줄이면 대부분의 상황을 판별할 수 있습니다.
bash 브라우저에서 실행
🤔 확인 문제
쇼핑몰이 느려서 top을 봤더니 %Cpu(s): 6.0 us, 4.0 sy, 8.0 id, 81.0 wa 입니다. 무엇이 병목인가요?
🤔 확인 문제
논리 CPU 12개짜리 서버의 load average가 3.20, 8.50, 14.10 입니다. 지금 상황은?