Devin.KR

CPU와 메모리 읽기

100분 안팎

학습 목표

제공된 제한된 작업을 관찰해 CPU·RSS·available·입출력 대기의 차이를 기록합니다.

개념

느림을 숫자 하나로 판정하지 않습니다

웹 응답이 느려졌다는 신고를 받으면 먼저 어떤 시간대의 어떤 작업인지 정합니다. CPU 사용률 하나가 낮다고 서버에 문제가 없다고 말할 수 없습니다. 디스크 대기나 메모리 회수로 응답이 지연될 수도 있고 앱의 잠금 대기일 수도 있습니다. 이번 레슨은 제한된 작업과 작은 판정 함수를 이용해 관측값의 의미를 구분합니다. 자원 고갈을 일으키는 부하 실험 대신 짧고 유한한 작업으로 측정과 해석의 연결을 연습합니다.

CPU의 측정 구간

프로세스 CPU 시간은 실행에 소비한 시간이고 경과 시간은 기다린 시간도 포함합니다. ps의 pcpu는 procps에서 프로세스 수명에 걸친 비율이라 최근 1초 사용률과 같다고 읽지 않습니다. top이나 반복 표본의 구간도 함께 기록합니다. 여러 CPU를 쓰는 프로그램은 도구의 정규화 방식에 따라 100%를 넘을 수 있습니다. 수치의 단위와 CPU 수, 도구 이름 없이 높다거나 낮다고 표현하면 인계받는 사람이 같은 판단을 재현하기 어렵습니다.

RSS와 주소 공간

RSS는 현재 물리 메모리에 상주한 프로세스 페이지의 크기이며 VSZ는 가상 주소 공간 크기입니다. 주소 공간 예약이 곧 같은 크기의 RAM 독점을 뜻하지 않습니다. Linux ps의 rss는 KiB로 읽고 바이트와 혼동하지 않습니다. 공유 페이지가 각 프로세스 RSS에 포함될 수 있어 여러 RSS의 합을 호스트 메모리 소비량과 동일하게 취급하지 않습니다. VM 전체와 특정 프로세스의 관측 범위를 나누어 기록합니다.

available과 free

free -m의 free가 적어도 캐시를 회수하며 새 작업을 수용할 여지가 있을 수 있습니다. available은 스왑 없이 새 작업에 제공 가능한 메모리의 추정값입니다. 현재 비어 있는 페이지 수와 역할이 다릅니다. available이 충분해도 서비스의 별도 제한이 있는 환경에서는 그 제한을 더 확인해야 합니다. 이번 실습의 단순 판정 함수는 주어진 available_kib로 조사 우선순위를 정할 뿐 모든 OOM 원인을 판정하지 않습니다.

입출력 대기의 의미

vmstat의 wa는 CPU 시간 집계에서 입출력 대기로 분류된 비율입니다. 개별 프로세스가 기다린 시간 비율이나 디스크 사용률과 같은 값이 아닙니다. CPU가 다른 일을 할 수 있는 환경에서는 입출력이 진행돼도 wa가 낮을 수 있습니다. 높은 값이 보이면 저장장치 지연·큐·앱 응답과 함께 조사하는 근거로 삼습니다. wa만 보고 디스크가 고장났다고 단정하거나 값을 낮추려고 프로세스를 중단하지 않습니다.

첫 표본과 후속 표본

vmstat 1 3은 반복 관측을 만들지만 기본 첫 행은 부팅 이후의 평균 정보가 섞여 있습니다. 이후 간격 표본을 현재 작업과 대조합니다. free와 ps도 서로 다른 시각에 실행하면 같은 순간의 시스템 그림이 아닙니다. 관측 시각을 붙이고 앱 요청 전·요청 중·완료 뒤를 구분합니다. 로그에는 원시 수치와 단위를 먼저 남기고 판단을 다음 줄에 씁니다. 높은 값만 골라 남기면 정상 기준과 비교할 수 없습니다.

제한된 실험

workload.py는 4MiB bytearray를 만들고 페이지 간격으로 접근한 뒤 약 0.2초의 계산을 수행합니다. 끝나는 조건이 있으므로 무한 반복이나 메모리를 한계까지 채우는 실험이 아닙니다. 출력의 elapsed_seconds와 cpu_seconds는 실행마다 달라지며 고정 정답이 아닙니다. resource의 ru_maxrss는 최대 상주량이고 현재 RSS가 아닙니다. Linux에서는 KiB, macOS에서는 바이트로 보고되므로 maxrss_native를 그대로 서로 비교하지 않습니다.

판정 정책을 코드로 분리합니다

metrics.py의 assess는 cpu·rss_kib·available_kib·wait 네 값을 받고 memory-review, io-review, cpu-review, observe 중 하나를 반환합니다. 먼저 available이 32768KiB 미만이면 메모리 조사, 다음 wait가 20 이상이면 입출력 조사, 다음 cpu가 80 이상이면 CPU 조사입니다. 이 숫자는 경계 테스트를 위한 학습용 정책이며 운영의 공통 임계값이 아닙니다. 여러 조건이 참일 때의 우선순위를 요구로 정한 뒤 구현합니다.

경계와 누락을 검증합니다

32768은 메모리 조건에 포함되지 않고 32767은 포함됩니다. wait 20과 cpu 80은 각각 포함됩니다. RSS가 크다는 이유만으로 메모리 조사 조건을 새로 넣으면 요구와 달라집니다. 누락 키와 음수는 관측 실패로 보고 ValueError를 발생시킵니다. 0은 정상 범위의 관측값이므로 누락과 같은 취급을 하지 않습니다. test_metrics.py는 경계·복합 조건·오류 입력을 검사해 단순 정상 예제만 통과하는 구현을 걸러 냅니다.

오류와 제출 기록

missing metric은 자료 수집에서 필요한 필드가 빠졌다는 뜻이고 negative metric은 단위 변환이나 차분 계산을 다시 볼 신호입니다. 정책 오류와 수집 오류를 한 알림으로 합치면 조사 방향이 흐려집니다. 기록에는 PID·시각·CPU 측정 구간·RSS 단위·available·wa와 다음 조사 항목을 씁니다. 자동 테스트의 통과는 정책 구현의 확인이며 VM 자원 측정 성공을 대신하지 않습니다. 페이지와 주소 변환의 자세한 원리는 더 읽기로 넘기고 여기서는 관측값으로 다음 행동을 정하는 데 집중합니다.

명령·API 의미의 기준은 공식 문서에서 확인합니다. 상세 원리는 더 읽기의 서재 장으로 연결합니다.

수집 명령이 실패하면 정상 수치 0으로 바꿔 넣지 않습니다. stderr와 종료 상태를 남기고 누락된 관측으로 구분합니다. CPU와 메모리 수치가 정상이어도 앱 잠금 대기나 외부 요청 지연은 남을 수 있으므로 응답 시간과 측정 시점을 함께 검토합니다.

따라하기

비율과 단위 연습

교육용 CPU 시간과 RSS 단위를 계산합니다. 실제 시스템 표본이 아닙니다.

cpu_seconds=0.1
elapsed_seconds=0.5
rss_kib=4096
print('cpu_percent=%.1f' % (100*cpu_seconds/elapsed_seconds))
print('rss_mib=%.1f' % (rss_kib/1024))

실행 결과

cpu_percent=20.0
rss_mib=4.0

유한 작업 실행

ZIP 폴더에서 짧은 작업을 실행합니다. 표시 출력은 이 맥에서 실행한 결과입니다. 실행마다 달라지는 경과 시간과 CPU 시간을 관측합니다.

python3 workload.py

실행 결과

elapsed_seconds=0.200 cpu_seconds=0.199 maxrss_native=19136512

Linux 표본 수집

Linux VM에서 후속 vmstat 행과 available을 기록합니다. 앱 PID가 살아 있는 동안 ps -p PID -o pid,pcpu,rss,etime,args도 조회합니다.

free -m
vmstat 1 3

정책 경계 확인

metrics.py의 누락 조건을 구현하고 경계값 및 오류 입력 검사를 실행합니다.

bash check.sh

확인 문제

실습

metrics.py에서 누락된 입출력 대기 조건을 완성합니다. 우선순위·경계값·누락·음수 처리를 유지하고 VM에서 단위를 붙인 자원 기록을 제출합니다.

시작 코드·테스트 내려받기

실행 명령

bash check.sh

기대 결과

PASS metrics: 5 cases and invalid inputs

모범 답안모범 답안 내려받기

더 읽기

면접 질문

  • 프로세스와 systemd 서비스 상태의 차이를 설명합니다.