사용량과 자원 목록
65분 안팎
학습 목표
서비스별 CPU·메모리·디스크와 남은 자원을 확인합니다.
개념
자원을 설명할 수 있는 상태로 만듭니다
안내판 서비스는 배포가 끝난 뒤에도 후보 컨테이너·복원용 볼륨·수집기를 남깁니다. 실행 중인 서비스 하나만 기억하면 중지한 실습 자원과 보존 데이터가 목록에서 빠집니다. 사용량 조사는 삭제 명령을 고르는 단계보다 먼저입니다. 누가 만든 무엇이 어떤 서비스에 쓰이는지 설명할 수 있도록 목록을 만듭니다. 이번 레슨의 결과는 개인 프로젝트 자원 목록과 CPU·메모리·디스크 관측의 단위·미측정 표시입니다. 삭제 후보 판단은 다음 레슨에서 이어갑니다.
이 모듈의 실습 환경
Python 3.8 이상과 터미널을 사용합니다. local 압축을 풀고 zip 루트에서 안내 명령을 실행합니다. 테스트는 unittest이며 외부 패키지를 설치하지 않습니다. browser 과제는 표준 입력으로 JSON을 받고 표준 출력만 채점합니다. Docker와 OpenTofu 실행은 별도 환경에서 확인하는 external 실습이며 실제 자원 생성·삭제 결과는 대기 상태로 기록합니다. 이 모듈은 클라우드 계정이나 요금 결제를 요구하지 않습니다. fixture는 교육 데이터이고 실제 관측과 명확히 구분합니다.
프로젝트 라벨과 소유자는 다릅니다
m05부터 자원에는 bootcamp.project 라벨로 개인 실습 이름을 붙였습니다. bc-board 같은 프로젝트 값은 범위를 정하는 식별자이고 owner는 책임 역할입니다. 서비스팀은 앱 데이터를, 플랫폼팀은 네트워크 설정을 설명할 수 있습니다. 같은 이름 접두사만으로 소유권을 추측하지 않습니다. 라벨 없는 자원은 조회 범위 밖일 뿐 불필요하다는 뜻이 아닙니다. 별도 미분류 목록에 남겨 생성 기록과 담당을 조사합니다. 목록에서 제외한 다른 팀 자원이 삭제되는 일도 없어야 합니다.
서로 다른 세 자원을 셉니다
container는 프로세스 실행과 설정, network는 통신 연결, volume은 앱 데이터 저장을 담당합니다. 중지한 container도 볼륨을 참조할 수 있으므로 container ls의 기본 결과만 읽으면 부족합니다. 실제 조회에서는 container ls -a를 사용하여 중지한 자원도 포함합니다. 동일한 문자열 이름이 서로 다른 종류에 사용될 수 있어 중복 판정 키는 kind와 id의 쌍입니다. 동일 쌍이 두 번 나오면 통계가 부풀므로 오류로 다룹니다. 종류별 정렬은 제출 자료를 재비교하기 쉽게 만듭니다.
CPU 표본에 시각을 붙입니다
cpu_percent는 수집 시점의 퍼센트이며 이번 fixture의 0.0은 관측한 값입니다. 한 번의 표본만으로 서비스가 하루 종일 유휴였다고 말하지 않습니다. 실제 조사에서는 관측 시작·끝과 수집 간격을 함께 적고 요청량 및 작업 시간과 대조합니다. 여러 CPU를 사용하는 환경의 표시값은 단순한 한 코어 비율 가정과 다를 수 있습니다. 값의 정의는 수집 도구 문서와 함께 확인합니다. 이 레슨은 CPU 수치를 요금으로 변환하거나 비용 절감액을 계산하지 않습니다. Docker stats 공식 문서에서 표시값의 범위를 확인합니다.
메모리와 디스크를 섞지 않습니다
memory_bytes는 이 fixture가 정수 byte로 제공한 메모리 표본이고 disk_bytes는 저장 데이터의 측정값입니다. 컨테이너 writable layer 크기는 연결한 volume의 사용량을 대신하지 않습니다. 이미지 크기·호스트 파일시스템·업무 데이터 크기도 서로 다른 범위입니다. Docker 통합 수집기의 memory_display는 사람이 읽는 문자열 그대로 남기므로 memory_bytes처럼 합산하지 않습니다. 보고서에는 어떤 자원의 어떤 범위를 어떤 방법으로 쟀는지 씁니다. 동일 파일을 여러 경로로 센 중복도 조사합니다.
미측정은 숫자 0이 아닙니다
network에 업무 디스크 사용량을 측정하지 않았으면 disk_bytes를 null로 둡니다. 화면에는 UNKNOWN으로 표시합니다. 0은 측정 결과가 없다는 뜻으로 대체할 수 없습니다. stopped container도 CPU 자료가 없으면 null로 표시하며 메모리가 남지 않았다는 별도 사실을 추측하지 않습니다. 음수·불리언·무한대 같은 잘못된 수치는 거부합니다. 측정 오류를 0으로 보정하면 낭비 후보 판단이 그 오류를 정상 자료로 믿게 됩니다. 값과 자료 상태를 함께 유지하는 것이 목적입니다.
목록 함수를 완성합니다
starter의 usage.py는 프로젝트 필터를 비워 두었습니다. inventory.json에는 개인 실습의 container·network·volume 세 개와 다른 프로젝트의 shared-data가 있습니다. inventory 함수가 개인 프로젝트 값과 일치한 행만 남기도록 수정합니다. 나머지 정렬·owner 필수·metric 검사와 테스트 기대값은 유지합니다. 문자열 부분 포함이나 접두사 비교를 쓰면 bc-board-copy까지 섞일 수 있으므로 완전 일치를 사용합니다. 없는 프로젝트는 빈 목록을 반환하지만 프로젝트 이름 자체의 형식 오류는 거부합니다.
실패 메시지를 읽습니다
test_scope의 4 != 3은 개인 자원 수가 기대보다 하나 많다는 뜻입니다. test_order의 배열 차이는 다른 프로젝트 volume이 정렬 결과에 섞였는지 보여 줍니다. owner required는 책임 역할이 비어 있고 duplicate resource는 동일 kind/id가 반복됐다는 뜻입니다. metric 오류에서는 단위 변환 전에 음수와 자료 형식을 확인합니다. FAIL Python 3 required는 실행 도구 문제이므로 라벨 필터를 바꾸어 해결하지 않습니다. traceback의 함수와 assertion 값을 읽고 자료 오류와 로직 오류를 나눕니다.
실제 관측으로 넘어갑니다
미션의 inventory-docker.py는 정확한 프로젝트 라벨 조회 후 inspect로 다시 라벨을 확인합니다. 실행 중인 컨테이너에서만 stats --no-stream을 수집하고 UTC 시각을 기록합니다. 볼륨 디스크는 미측정으로 남겨 별도 읽기 전용 관측이 필요함을 드러냅니다. 실제 실행 명령은 출력이 비어 있으며 본인 환경의 JSON을 열어 이름·시각·표본을 확인합니다. 이름·상태·단위·담당을 리뷰한 목록을 다음 보고서 입력의 출발점으로 사용합니다. 비밀 환경 변수 전체를 출력하여 목록에 붙이지 않습니다.
디스크 해석은 범위를 좁혀 읽습니다
du는 저장 경로의 사용량을 조사할 때 도움이 되지만 컨테이너와 호스트의 모든 저장소를 한 값으로 대표하지 않습니다. 볼륨에 연결한 전용 데이터 경로부터 읽고, 할당 공간과 파일 길이가 다른 경우 측정 방법을 적습니다. 권한 오류가 나면 누락을 보고서에 남기고 정상 합계인 것처럼 제출하지 않습니다. GNU와 BSD 옵션 차이 및 df와의 비교는 더 읽기의 du 장에서 확인합니다. 여기서 제출할 목록에는 추측한 용량을 넣지 않고 확인한 값 또는 미측정을 넣습니다.
따라하기
미측정과 0 표시
같은 출력 칸에서도 자료 상태를 구분합니다. 아래는 실제 실행한 교육 예제 결과입니다.
for value in [None,0,4096]:
print('UNKNOWN' if value is None else value)실행 결과
UNKNOWN 0 4096
소유 범위 비교
완전 일치가 유사 이름을 제외하는지 실행합니다.
project='bc-board'
for label in ['bc-board','bc-board-copy','other',None]:
print(str(label),label==project)실행 결과
bc-board True bc-board-copy False other False None False
목록 과제 검사
inventory starter.zip 루트에서 실행합니다. 처음에는 test_scope와 test_order가 실패합니다. usage.py의 프로젝트 완전 일치 필터를 완성한 뒤 9개 검사와 목록을 확인합니다.
bash check.sh
python3 -B usage.py inventory.json bc-board실제 Docker 목록 수집
앞 모듈 자원 준비 후 미션 zip에서 실행합니다. external 명령이므로 출력은 없습니다. JSON의 프로젝트·owner·UTC 시각을 읽습니다. 마지막 du는 개인 volume만 읽기 전용으로 측정하며 출력 단위는 KiB 블록입니다. 이 값과 파일 byte 길이를 혼동하지 않습니다.
python3 -B inventory-docker.py bc-yourname service-team > inventory-live.json
docker container ls -a --filter label=bootcamp.project=bc-yourname
docker run --rm --mount type=volume,src=bc-yourname-data,dst=/source,readonly alpine:3.20 du -sk /source확인 문제
실습
usage.py의 inventory에서 project 값이 정확히 일치한 행만 남기도록 완성합니다. fixture의 shared-data는 다른 프로젝트입니다. 정렬·owner·중복·metric 오류 검사를 유지하고 9개 테스트를 통과시킵니다. 출력의 UNKNOWN과 관측된 0을 구분합니다. 테스트 기대값은 수정하지 않습니다.
실행 명령
bash check.sh
기대 결과
PASS inventory: 9 cases
모범 답안
모범 답안 내려받기더 읽기
면접 질문
- 실습 자원을 안전하게 정리하는 순서를 설명합니다.