19.10.4 容量规划与资源利用率治理
容量规划与资源利用率治理目标是在满足业务增长与SLA的前提下,降低闲置与浪费,实现“可预测、可弹性、可优化”。核心输出包括:容量基线、增长模型、资源池配额策略、扩容/缩容触发策略与治理闭环。
1. 容量规划方法与基线建立(含示例)
- 业务驱动模型:以业务指标映射资源需求,形成换算公式。
- 历史趋势模型:使用峰值、P95、P99与季节性特征计算增长斜率与波动区间。
- 压测基线:基于典型工作负载获取单节点吞吐与瓶颈点,形成容量单元。
示例:建立“QPS→CPU核”换算与基线
# 安装压测与系统工具
sudo yum -y install sysstat dstat stress-ng || sudo apt -y install sysstat dstat stress-ng
# 压测获取单机吞吐(以HTTP服务为例,需替换URL)
ab -n 200000 -c 200 http://127.0.0.1:8080/ > /tmp/ab.txt
# 监控CPU/内存/IO
sar -u 1 10
sar -r 1 10
iostat -x 1 10
# 解析吞吐
grep "Requests per second" /tmp/ab.txt
# 预期:输出单机QPS基线,例如 1200 [#/sec]
示例:计算业务换算公式(简化)
# 公式:CPU核数 = 业务QPS / 单核QPS * 冗余系数
# 假设单核QPS=300,业务QPS=9000,冗余系数=1.2
python3 - <<'PY'
qps=9000
per_core=300
redundant=1.2
cores=qps/per_core*redundant
print(f"建议CPU核数:{cores:.1f}")
PY
# 预期:建议CPU核数:36.0
2. 容量评估与冗余策略(含示例)
- N+1/N+2冗余:关键组件覆盖节点故障与故障域切换。
- SLA与可用性权衡:冗余量与SLA等级绑定,避免过度冗余。
- 弹性空间:预留应急扩容空间(10%~30%)。
示例:N+1冗余计算
# 可承载实例=总实例-冗余实例
python3 - <<'PY'
total=10
redundant=1
print("可承载实例:", total-redundant)
PY
# 预期:可承载实例: 9
3. 资源池与配额治理(含示例)
- 资源池分层:生产/预发/测试分池,按优先级设置超配与回收。
- 配额与预算:按业务线设置配额、预警阈值与审批流程。
- 超卖与隔离:非关键业务可控超卖,结合限流与隔离。
示例:Kubernetes命名空间配额(生产)
# 文件: /etc/k8s/quota-prod.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
name: prod-quota
namespace: prod
spec:
hard:
requests.cpu: "200"
requests.memory: "400Gi"
limits.cpu: "300"
limits.memory: "600Gi"
kubectl apply -f /etc/k8s/quota-prod.yaml
kubectl describe quota -n prod
# 预期:显示prod命名空间CPU/内存配额与已用量
4. 利用率治理指标(含示例与命令解释)
- CPU/内存:关注均值与峰值并行,防止高抖动与低利用。
- 磁盘与IOPS:跟踪容量水位线、IO等待与热点盘。
- 网络带宽:结合吞吐、丢包率与连接数评估扩容。
示例:采集CPU/内存/磁盘/网络
# CPU利用率(%usr+%sys)与负载
sar -u 1 5
# 内存使用与缓存
free -h
# 磁盘容量水位线
df -hT
# IO瓶颈(重点看 %util 和 await)
iostat -x 1 5
# 网络丢包率
ping -c 20 10.0.0.1 | tail -1
Prometheus指标查询示例(Grafana/PromQL)
# 节点CPU利用率(排除空闲)
1 - avg(rate(node_cpu_seconds_total{mode="idle"}[5m])) by (instance)
# 内存使用率
1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)
# 磁盘使用率
1 - (node_filesystem_avail_bytes / node_filesystem_size_bytes)
5. 容量优化策略(含示例)
- 规格优化:调整实例规格、应用拆分与资源请求/限制优化。
- 弹性伸缩:基于CPU、QPS、队列积压自动扩缩容。
- 冷热分层:按访问频率分层存储或节点部署。
- 回收机制:闲置资源定期盘点与自动回收。
Kubernetes HPA示例(CPU驱动扩缩容)
# 文件: /etc/k8s/hpa-web.yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: web-hpa
namespace: prod
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: web
minReplicas: 3
maxReplicas: 20
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 60
kubectl apply -f /etc/k8s/hpa-web.yaml
kubectl get hpa -n prod
# 预期:当CPU > 60%时自动扩容
6. 预测与预警机制(含示例)
- 趋势预测:使用时间序列预测容量缺口,提前触发采购或扩容。
- 容量红线:设定水位线(70/85/95)与应急预案。
- 突发峰值响应:预置扩容脚本与资源池快速借调。
示例:基于历史数据简单线性预测
# 文件: /opt/capacity/forecast.py
cat >/opt/capacity/forecast.py <<'PY'
import numpy as np
# 过去6个月CPU峰值(核)
y=np.array([120,130,150,170,190,220])
x=np.arange(len(y))
coef=np.polyfit(x,y,1)
next_3 = [coef[0]*(len(y)+i)+coef[1] for i in range(1,4)]
print("未来三月预测:", [round(v,1) for v in next_3])
PY
python3 /opt/capacity/forecast.py
# 预期:输出未来三月CPU峰值预测
示例:容量红线告警(Prometheus规则片段)
# 文件: /etc/prometheus/rules/capacity.yaml
groups:
- name: capacity.rules
rules:
- alert: NodeDiskUsageHigh
expr: (1 - (node_filesystem_avail_bytes / node_filesystem_size_bytes)) > 0.85
for: 10m
labels:
severity: warning
annotations:
summary: "磁盘使用率超过85%"
7. 治理闭环与评估(含流程与示例)
- 月度/季度容量评审:回顾预测准确率与资源使用偏差。
- 异常复盘:容量不足、过度扩容、资源浪费事件根因分析。
- 持续优化:指标、策略与预算纳入运维度量体系。
示例:容量评审输出模板(摘录)
月份: 2024-09
预测峰值CPU: 180核
实际峰值CPU: 170核
偏差率: -5.6%
动作: 下调冗余系数 1.2 -> 1.1
安装清单(必备工具)
# 监控采集
sudo yum -y install sysstat dstat iotop || sudo apt -y install sysstat dstat iotop
# 压测工具
sudo yum -y install httpd-tools || sudo apt -y install apache2-utils
# Prometheus Node Exporter(示例)
useradd -r -s /sbin/nologin node_exporter
wget -O /tmp/node_exporter.tgz https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz
tar -zxf /tmp/node_exporter.tgz -C /opt/
ln -s /opt/node_exporter-1.7.0.linux-amd64/node_exporter /usr/local/bin/node_exporter
排错指南(常见问题与命令)
- 压测QPS异常低:检查应用日志与后端瓶颈
bash
tail -n 200 /var/log/app/app.log
ss -lntp | grep 8080
- 磁盘IO等待高:定位热点盘与高IO进程
bash
iostat -x 1 5
iotop -o
- CPU高但QPS无提升:检查锁竞争、GC或线程数
bash
top -H -p $(pgrep -f java)
练习
1. 在测试环境压测一个HTTP服务,计算单机QPS基线,并输出“业务QPS→CPU核”的换算公式。
2. 为生产命名空间设置配额,并验证超配时的报错信息。
3. 使用PromQL计算内存使用率,设置85%告警规则。
4. 用历史数据做一次容量预测,给出未来三个月扩容建议。