概述
Kubernetes CPU 限制看似能保护集群稳定性,实则可能因 Linux 内核 Bug 导致不必要的 CPU 流控,严重影响服务性能。Buffer 团队通过移除 CPU 限制,实现了服务响应速度最高 22 倍的提升。
核心发现:
- ⚠️ CPU 限制触发不必要流控
- 🐛 Linux 内核 < 4.19 存在 Bug
- 🚀 移除限制后性能大幅提升
- ⚖️ 需要权衡稳定性和性能
适用场景:
- 服务响应延迟高
- CPU 未满但仍被流控
- 追求极致性能
- 内核版本 < 4.19
原文链接: https://blog.fleeto.us/post/k8s-faster-services-no-cpu-limits/
推荐配合阅读: 站内《最大最小内存设置为一致》文章
背景
Buffer 的 Kubernetes 实践
基本情况:
| 项目 | 数据 |
|---|---|
| 开始时间 | 2016 年 |
| 管理工具 | kops |
| 节点数量 | ~60 个(AWS) |
| 容器数量 | ~1500 个 |
| 服务架构 | 微服务 |
CPU 限制机制
工作原理
CPU 限制(CPU Limit):
1 | resources: |
限制机制:
1 | CFS 配额周期(默认): 100ms |
官方建议:
Google 等公司强烈建议设置 CPU 限制,防止容器耗尽节点资源,导致 kubelet 等关键进程停止响应。
CPU 限制与流控
CFS(Completely Fair Scheduler)配额:
| 参数 | 说明 | 默认值 |
|---|---|---|
| cpu.cfs_period_us | 配额周期 | 100,000 微秒(100ms) |
| cpu.cfs_quota_us | 配额时间 | limit * period |
| throttled | 流控次数 | 监控指标 |
流控效果:
1 | 正常运行:[████████████████████] 100% |
影响:
- ⏱️ 增加响应延迟
- 📉 降低吞吐量
- 🔄 即使 CPU 未满也会触发
问题发现
不设置 CPU 限制的风险
可能导致的问题:
1 | 容器占用过多 CPU |
奇怪的流控现象
Buffer 的发现:

数据对比:
| 指标 | 设置值 | 实际值 | 结论 |
|---|---|---|---|
| CPU Limit | 800m | - | 限制 |
| 实际最大使用 | - | 200m | 远低于限制 |
| 预期 | - | 无流控 | ❌ |
| 实际 | - | 频繁流控 | ⚠️ |
流控可视化:

关键问题:
为什么 CPU 消耗仅 25% 时(200m/800m),还会频繁触发流控?
原因分析
根本原因:Linux 内核 Bug
相关资源:
| 资源 | 链接/说明 |
|---|---|
| GitHub Issue | kubernetes#67577 |
| Zalando 分享 | YouTube 视频 |
| omio 文章 | Medium 帖子 |
| Dave Chiluk 演讲 | Unthrottled |
| 详细文字稿 | Indeed 博客 |
Bug 本质:
1 | Linux 内核 < 4.19: |
解决方案
决策:移除 CPU 限制
团队决定:
- ✅ 删除所有关键服务的 CPU 限制
- ⚠️ 承担集群稳定性风险
- 📊 通过监控和隔离降低风险
配套措施
1. 服务隔离
隔离策略(Taint & Toleration):

节点分类:
| 节点类型 | CPU 限制 | 用途 | 隔离方式 |
|---|---|---|---|
| 受限节点 | ✅ 设置 | 常规服务 | 默认调度 |
| 不受限节点 | ❌ 无限制 | 关键服务 | Taint 隔离 |
配置示例:
1 | # 节点打 Taint |
优势:
- ✅ 防止不受限服务影响其他服务
- ✅ 故障范围可控
- ✅ 便于排查问题
2. 设置合理的 CPU Requests
方法论:
1 | 1. 使用 Datadog 等工具监控数天/数周 |
示例:

计算过程:
1 | 观测到的 CPU 峰值: 242m |
配置示例:
1 | resources: |
考虑因素:
| 因素 | 说明 | 建议 |
|---|---|---|
| 流量波动 | 面向用户的服务 | 更高的安全系数 |
| 资源密集型 | 计算/数据处理 | 观察更长时间 |
| 突发流量 | 营销活动等 | 配合 HPA 使用 |
3. 增强弹性和监控
HPA(Horizontal Pod Autoscaler):
1 | apiVersion: autoscaling/v2 |
监控告警:
1 | # 节点资源不足告警 |
集群自动扩容:
1 | # AWS Cluster Autoscaler |
代价:容器密度降低
资源规划变化:
1 | 优化前: |
权衡:
- ❌ 需要更多节点资源
- ✅ 性能大幅提升
- ✅ 服务稳定性提高
效果
性能提升
整体结果:

具体数据:
| 服务 | 优化前延迟 | 优化后延迟 | 提升倍数 |
|---|---|---|---|
| API 服务 1 | ~200ms | ~50ms | 4x |
| API 服务 2 | ~150ms | ~30ms | 5x |
| 数据处理 | ~500ms | ~100ms | 5x |
| 着陆页 | ~440ms | ~20ms | 22x |
典型案例:着陆页
Buffer.com 着陆页:

改进详情:
1 | 响应时间:440ms → 20ms |
业务影响:
- ✅ 首页加载速度快 22 倍
- ✅ 降低跳出率
- ✅ 提升转化率
- ✅ 改善 SEO 评分
内核修复状态
Linux 内核补丁
修复版本: Linux 4.19+
修复提交: kernel.org commit
感谢: Dave Chiluk 发现并修复
各发行版修复状态
Linux 发行版:
| 发行版 | 修复版本 | 状态 | 说明 |
|---|---|---|---|
| Debian | Buster (最新) | ✅ 已修复 | 更新详情 |
| Ubuntu | 20.04 Focal | ✅ 已修复 | Releases |
| CentOS | 8+ | ✅ 已修复 | 需验证具体版本 |
| RHEL | 8+ | ✅ 已修复 | 需验证具体版本 |
托管 Kubernetes:
| 平台 | 修复时间 | 状态 | 说明 |
|---|---|---|---|
| EKS | 2019 年 | ✅ 已修复 | Roadmap Issue |
| GKE | 2020.01 | ✅ 已修复 | Release Notes |
| kops | 1.18 (2020.06) | ✅ 已修复 | PR#9283 |
| AKS | 2020 年 | ✅ 已修复 | 需验证 |
检查内核版本:
1 | # 检查当前内核版本 |
仍需注意
注意事项:
即使修复,也建议测试
- 仍有报告称问题偶发
- 建议在测试环境验证
监控流控指标
1
2# 查看容器流控次数
cat /sys/fs/cgroup/cpu/cpu.stat | grep throttled逐步推广
- 先在非关键服务测试
- 观察一段时间
- 再应用到生产环境
实施指南
决策流程
是否移除 CPU 限制?
graph TD
A[服务有延迟问题?] -->|是| B[检查流控指标]
A -->|否| Z[保持现状]
B --> C{CPU 使用 < 80% 但频繁流控?}
C -->|是| D[检查内核版本]
C -->|否| Z
D --> E{内核 < 4.19?}
E -->|是| F[升级内核或移除限制]
E -->|否| G[考虑移除限制测试]
F --> H[实施隔离策略]
G --> H
H --> I[设置合理 Requests]
I --> J[配置 HPA]
J --> K[监控观察]实施步骤
Step 1:评估和准备
1 | # 1. 检查当前流控情况 |
Step 2:节点隔离
1 | # 为节点打标签和 Taint |
Step 3:更新 Deployment
1 | # deployment.yaml |
Step 4:配置 HPA
1 | kubectl autoscale deployment my-service \ |
Step 5:监控和调整
1 | # 监控关键指标 |
回滚计划
如果出现问题:
1 | # 1. 立即恢复 CPU 限制 |
最佳实践
推荐配置
生产环境配置模板:
1 | apiVersion: apps/v1 |
监控指标
关键监控项:
| 指标 | 说明 | 告警阈值 |
|---|---|---|
| CPU 使用率 | 节点/Pod CPU 使用 | > 85% |
| 内存使用率 | 节点/Pod 内存使用 | > 90% |
| 响应延迟 | P50/P95/P99 延迟 | 基线 × 1.5 |
| Pod 重启 | 异常重启次数 | > 3次/小时 |
| 节点状态 | NotReady 节点 | > 0 |
注意事项
关键点:
| 注意事项 | 说明 |
|---|---|
| ⚠️ 保留内存限制 | 内存缺 OOM killer,必须限制 |
| ⚠️ 设置合理 Requests | 防止过度调度 |
| ⚠️ 配置 HPA | 应对突发流量 |
| ⚠️ 监控节点资源 | 防止节点过载 |
| ⚠️ 逐步推广 | 先测试再生产 |
总结
核心观点:
✅ Linux < 4.19 存在 CPU 流控 Bug
- 即使 CPU 空闲也会触发流控
- 严重影响服务性能
✅ 移除 CPU 限制可大幅提升性能
- Buffer 案例:最高 22 倍提升
- 但需要配套措施保障稳定性
✅ 推荐做法:
- 优先升级内核到 4.19+
- 如果无法升级,考虑移除限制
- 必须配合隔离、监控、HPA
✅ 权衡:
- 性能 vs 稳定性
- 容器密度 vs 响应速度
- 根据业务需求决策
行动建议:
1 | # 1. 检查内核版本 |