深色模式
容量预测与趋势
预测的目的不是算准,而是提前知道"大概什么时候会不够"。本文用线性回归和季节性修正做外推,并给出误差评估方法。
适用环境
- Prometheus 保留了 ≥ 90 天数据(或已导出 CSV)
- 有 Python 环境可做回归
- 业务无重大重构计划(否则历史失效)
bash
python3 -c 'import numpy, pandas; print("ok")'1
操作步骤
1. 导出历史数据
bash
# 导出近 90 天每日磁盘用量(GB)
curl -s -G 'http://localhost:9090/api/v1/query_range' \
--data-urlencode 'query=node_filesystem_size_bytes{mountpoint="/data"} - node_filesystem_avail_bytes{mountpoint="/data"}' \
--data-urlencode 'start=2026-07-11T00:00:00Z' \
--data-urlencode 'end=2026-10-09T00:00:00Z' \
--data-urlencode 'step=1d' -o disk.json
jq -r '.data.result[0].values[] | @tsv' disk.json > disk.tsv
wc -l disk.tsv1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
2. 做线性回归外推
python
import pandas as pd, numpy as np
df = pd.read_csv('disk.tsv', sep='\t', header=None, names=['ts', 'bytes'])
df['gb'] = df['bytes'].astype(float) / 1024**3
df['day'] = np.arange(len(df))
# 最小二乘拟合
k, b = np.polyfit(df['day'], df['gb'], 1)
print(f"日均增长 {k:.2f} GB/天")1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
3. 计算耗尽时间
python
total_gb = 2048 # 磁盘总量
red_line = total_gb * 0.85
days_left = (red_line - df['gb'].iloc[-1]) / k
print(f"距 85% 红线还有 {days_left:.0f} 天")1
2
3
4
2
3
4
text
示例输出:
日均增长 8.3 GB/天
当前已用 1200 GB,红线 1740 GB
距红线还有 65 天 → 扩容截止日期约为 2026-12-131
2
3
4
2
3
4
4. 处理季节性(别把促销当常态)
业务有周期性(大促、周末、月末结算)时,单纯线性外推会失真。做法:
python
# 取每周同一天的峰值,单独建模周内规律
df['ts'] = pd.to_datetime(df['ts'], unit='s')
df['dow'] = df['ts'].dt.dayofweek
print(df.groupby('dow')['gb'].mean())
# 季节系数 = 某天均值 / 全期均值
season = df.groupby('dow')['gb'].mean() / df['gb'].mean()1
2
3
4
5
6
7
2
3
4
5
6
7
text
修正后峰值 = 线性预测值 × 当日季节系数 × 峰值系数1
5. 评估预测可信度
python
# 留最后 14 天做回测:用前 76 天拟合,预测后 14 天,对比误差
train, test = df.iloc[:-14], df.iloc[-14:]
k2, b2 = np.polyfit(train['day'], train['gb'], 1)
pred = k2 * test['day'] + b2
mape = (np.abs(pred - test['gb']) / test['gb']).mean() * 100
print(f"MAPE = {mape:.1f}%")1
2
3
4
5
6
2
3
4
5
6
| MAPE | 判断 | 用法 |
|---|---|---|
| < 10% | 可信 | 按预测排期 |
| 10% ~ 25% | 一般 | 取预测值 × 1.2 排期 |
| > 25% | 不可信 | 缩短复审周期到 2 周 |
6. 对业务驱动指标做预测(推荐)
资源预测噪声大,更稳的做法是先让业务给增长目标,再套负载模型:
text
业务给:下季度订单 +30%
模型算:峰值 QPS 2900 → 3770,需求 CPU 11.6 → 15 核,实例 5 → 7 台1
2
2
资源趋势外推用于校验(看业务目标是否与历史趋势一致),业务驱动用于决策。
验证
bash
# 对照检查:预测值与近 7 天实测值的偏差
tail -7 disk.tsv1
2
2
每月复盘一次:记录"上月预测值 vs 实际值",把误差写进容量报告,持续校准模型。
常见坑
用短周期数据外推
7 天数据做线性回归,斜率对噪声极度敏感,改一天数据结论就翻转。至少用 30 天,推荐 90 天。
大促/活动后立刻外推
促销期间的增长不代表常态。外推前必须剔除异常窗口,或单独为活动建模。
忽略阶跃变化
上线新功能、迁移、数据清理会造成曲线阶跃(上升或下降),回归会把阶跃误认为趋势。发现阶跃要重新取窗口。
预测到"还很久"就不复审
预测 65 天后到红线,但业务可能突然放量。必须固定月度复审,而不是依赖一次预测结果。