용량 계획과 변경 관리 — 언제 차는지 계산하고 멈출 시각을 먼저 적는다
디스크가 언제 차는지 계산하고 발주 마감일을 정한다
목표
120일 치 디스크 사용량 표에서 한 번뿐인 계단을 떼어 내 유기적 증가율을 구하고, 임계까지 남은 날수와 발주 마감일을 계산한 뒤, 같은 계산을 어떤 표에나 돌릴 수 있는 스크립트로 만듭니다.
왜 중요한가
"디스크가 몇 % 냐" 는 질문에는 모니터링 화면이 답합니다. 인프라 엔지니어가 답해야 하는 것은 "증설을 언제까지 주문해야 하느냐" 이고, 그 답은 증가 속도·임계·리드 타임 세 숫자에서 나옵니다. 이관 같은 한 번뿐인 증가를 추세에 섞으면 과잉 발주가, 성장을 무시하면 결품이 됩니다. 이 실습은 두 기울기(전체와 계단 이후)를 나란히 구해 그 차이를 눈으로 보게 합니다.
재료는 /opt/lab/capacity/forecast/ 에 있고, 채점기는 기대값을 원본 재료에서 계산합니다. 마지막 단계의 스크립트는 채점할 때마다 새로 만든 표에도 돌려 봅니다.
단계
/opt/lab/capacity/forecast/의disk_usage.csv,holdout.csv,policy.env를/root/cap/으로 복사하세요./root/cap/01-now.txt에date=,used_gb=,used_pct=(용량 대비, 소수 첫째 자리)를 적으세요.- 120일 전체의 최소제곱 기울기를
/root/cap/02-naive.txt에slope_gb_per_day=(소수 둘째 자리)로 적으세요. - 전날보다 가장 크게 늘어난 날과 그 증가량을
/root/cap/03-step.txt에step_date=,step_gb=로 적으세요. - 계단 다음 날부터의 기울기를
/root/cap/04-organic.txt에slope_gb_per_day=로 적으세요. - 유기적 기울기로
/root/cap/05-runway.txt에days_to_threshold=,threshold_date=,days_to_full=을 적으세요(날수는 올림). /root/cap/06-order.txt에order_by=(임계 도달일 − LEAD_DAYS)와days_left=를 적으세요./root/cap/forecast.py <csv> <용량GB> <임계%>가 JSON{"step_date", "organic_slope", "days_to_threshold"}한 줄을 내게 만드세요.
참고
- 최소제곱 기울기:
Σ(x−x̄)(y−ȳ) / Σ(x−x̄)², x 는 첫날부터의 날수. - 날짜:
date.fromisoformat,timedelta(days=n). 올림:math.ceil. - 흔한 실수 1: 계단을 떼지 않은 기울기로 남은 날수를 구하는 경우 — 과하게 비관적인 예측이 됩니다.
- 흔한 실수 2: 스크립트에 이 표의 날짜나 숫자를 박아 두는 경우 — 채점기가 새로 만든 표에서 떨어집니다.
재료 복사
/opt/lab/capacity/forecast/ 의 파일 셋(disk_usage.csv, holdout.csv, policy.env)을 /root/cap/ 으로 복사하세요. 내용은 고치지 않습니다.
cp 로 디렉터리의 내용을 옮깁니다. 재료를 고치면 채점기가 원본과 달라졌다고 알려 줍니다.
지금 상태 적기
/root/cap/01-now.txt 에 세 줄을 적으세요: date=<표의 마지막 날짜>, used_gb=<그날 사용량>, used_pct=<policy.env 의 CAPACITY_GB 대비 백분율, 소수 첫째 자리>.
tail -1 로 마지막 줄을 봅니다. 백분율은 used ÷ capacity × 100 을 소수 첫째 자리로 반올림합니다.
전체 기간 기울기
120일 전체로 최소제곱 기울기(GB/일)를 구해 /root/cap/02-naive.txt 에 slope_gb_per_day=<값, 소수 둘째 자리> 로 적으세요. x 는 첫날부터의 날수입니다.
기울기 = Σ(x−x̄)(y−ȳ) / Σ(x−x̄)² 입니다. 날짜 문자열을 date.fromisoformat 으로 바꿔 첫날과의 차이(.days)를 x 로 씁니다.
계단 찾기
전날보다 사용량이 가장 크게 늘어난 날을 찾아 /root/cap/03-step.txt 에 step_date=<그날> 과 step_gb=<그날의 증가량, 정수> 를 적으세요.
이웃한 두 줄의 차이를 모두 구해 가장 큰 것을 고릅니다. 평소 하루 증가량의 수십 배라 눈에 띕니다.
유기적 기울기
계단이 난 날의 다음 날부터 마지막 날까지만으로 최소제곱 기울기를 다시 구해 /root/cap/04-organic.txt 에 slope_gb_per_day=<값, 소수 둘째 자리> 로 적으세요.
3단계와 같은 식을 step_date 보다 뒤인 행에만 적용합니다. 전체 기간 기울기와 크게 다르다면 그 차이가 계단이 기울기에 섞여 있던 몫입니다.
남은 날수
유기적 기울기로 계산해 /root/cap/05-runway.txt 에 세 줄을 적으세요: days_to_threshold=<THRESHOLD_PCT 까지 남은 날수, 올림>, threshold_date=<마지막 날짜 + 그 날수>, days_to_full=<100% 까지 남은 날수, 올림>.
남은 날수 = 올림((용량 × 비율 − 지금 사용량) ÷ 기울기) 입니다. math.ceil 을 쓰고, 날짜는 timedelta(days=…) 로 더합니다.
발주 마감일
/root/cap/06-order.txt 에 order_by=<threshold_date − LEAD_DAYS> 와 days_left=<마지막 날짜부터 order_by 까지의 날수> 를 적으세요.
LEAD_DAYS 는 policy.env 에 있습니다. days_left 가 한 자릿수라면 이 보고서의 첫 문장이 되어야 합니다.
아무 표에나 돌아가는 예측 스크립트
/root/cap/forecast.py 를 만드세요. python3 forecast.py <csv> <용량GB> <임계%> 로 부르면 표준 출력에 JSON 한 줄 {"step_date": "YYYY-MM-DD", "organic_slope": <숫자>, "days_to_threshold": <정수>} 을 내야 합니다. 계산 규칙은 4~6단계와 같습니다. 채점기는 holdout.csv 와, 채점할 때마다 새로 만든 표에 이 스크립트를 돌려 봅니다.
4~6단계의 계산을 함수로 묶고 sys.argv 로 파일과 두 숫자를 받습니다. 출력은 json.dumps 한 번이면 됩니다. python3 forecast.py holdout.csv 1000 80 으로 먼저 돌려 보세요.