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. 用历史数据做一次容量预测,给出未来三个月扩容建议。