LabHub
시작하기
배우기 러닝패스 코스

용량 계획과 변경 관리 — 언제 차는지 계산하고 멈출 시각을 먼저 적는다

디스크가 언제 차는지 계산하고 발주 마감일을 정한다

LabHub 에서 이어서 보기

목표

120일 치 디스크 사용량 표에서 한 번뿐인 계단을 떼어 내 유기적 증가율을 구하고, 임계까지 남은 날수와 발주 마감일을 계산한 뒤, 같은 계산을 어떤 표에나 돌릴 수 있는 스크립트로 만듭니다.

왜 중요한가

"디스크가 몇 % 냐" 는 질문에는 모니터링 화면이 답합니다. 인프라 엔지니어가 답해야 하는 것은 "증설을 언제까지 주문해야 하느냐" 이고, 그 답은 증가 속도·임계·리드 타임 세 숫자에서 나옵니다. 이관 같은 한 번뿐인 증가를 추세에 섞으면 과잉 발주가, 성장을 무시하면 결품이 됩니다. 이 실습은 두 기울기(전체와 계단 이후)를 나란히 구해 그 차이를 눈으로 보게 합니다.

재료는 /opt/lab/capacity/forecast/ 에 있고, 채점기는 기대값을 원본 재료에서 계산합니다. 마지막 단계의 스크립트는 채점할 때마다 새로 만든 표에도 돌려 봅니다.

단계

  1. /opt/lab/capacity/forecast/disk_usage.csv, holdout.csv, policy.env/root/cap/ 으로 복사하세요.
  2. /root/cap/01-now.txtdate=, used_gb=, used_pct= (용량 대비, 소수 첫째 자리)를 적으세요.
  3. 120일 전체의 최소제곱 기울기를 /root/cap/02-naive.txtslope_gb_per_day= (소수 둘째 자리)로 적으세요.
  4. 전날보다 가장 크게 늘어난 날과 그 증가량을 /root/cap/03-step.txtstep_date=, step_gb= 로 적으세요.
  5. 계단 다음 날부터의 기울기를 /root/cap/04-organic.txtslope_gb_per_day= 로 적으세요.
  6. 유기적 기울기로 /root/cap/05-runway.txtdays_to_threshold=, threshold_date=, days_to_full= 을 적으세요(날수는 올림).
  7. /root/cap/06-order.txtorder_by= (임계 도달일 − LEAD_DAYS)와 days_left= 를 적으세요.
  8. /root/cap/forecast.py <csv> <용량GB> <임계%> 가 JSON {"step_date", "organic_slope", "days_to_threshold"} 한 줄을 내게 만드세요.

참고

재료 복사

/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.txtslope_gb_per_day=<값, 소수 둘째 자리> 로 적으세요. x 는 첫날부터의 날수입니다.

기울기 = Σ(x−x̄)(y−ȳ) / Σ(x−x̄)² 입니다. 날짜 문자열을 date.fromisoformat 으로 바꿔 첫날과의 차이(.days)를 x 로 씁니다.

계단 찾기

전날보다 사용량이 가장 크게 늘어난 날을 찾아 /root/cap/03-step.txtstep_date=<그날>step_gb=<그날의 증가량, 정수> 를 적으세요.

이웃한 두 줄의 차이를 모두 구해 가장 큰 것을 고릅니다. 평소 하루 증가량의 수십 배라 눈에 띕니다.

유기적 기울기

계단이 난 날의 다음 날부터 마지막 날까지만으로 최소제곱 기울기를 다시 구해 /root/cap/04-organic.txtslope_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.txtorder_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 으로 먼저 돌려 보세요.