--cpus 是什么
--cpus 限制容器可以使用的 CPU 时间总量:--cpus=1.5 表示一秒内最多消耗 1.5 个 CPU 秒,多核机器上按配额分配。它的用途是防止单个容器把整机 CPU 吃满,影响同宿主上的其他服务。
基本信息
| 用途 | CPU 时间上限(基于 CFS 配额) |
|---|---|
| 语法 | --cpus=1.5 或 --cpus=2 |
| 相关参数 | --cpu-shares 只是争抢时的相对权重,不是上限 |
| 查看 | docker stats 看占用与限额的对照 |
| 编排对应 | compose 的 cpus 字段、编排平台的 CPU 限额 |
典型使用场景
- 多服务共用一个宿主:逐个设上限,防止一个服务抢占整机 CPU
- 复现线上性能问题:本地按线上配额运行,观察排队与延迟表现
- 批处理任务限速:限制后台任务的 CPU 占用,保护在线服务
- 排查响应变慢:确认服务是不是撞到了 CPU 限额
- 测试环境做资源隔离,避免压测把邻居的服务一起拖慢
- 为容量规划提供依据:观察长期占用率决定是否扩容
示例
示例
docker run -d --cpus=1.5 --name api app/api:1.4.2
docker stats --no-stream api # 看 CPU% 与限额的对照
docker inspect -f '{{.HostConfig.NanoCpus}}' api # 以纳秒表示的配额值
docker run -d --cpus=2 --name batch app/batch:1.4.2CPU 相关参数的区别
| 参数 | 语义 | 使用建议 |
|---|---|---|
| --cpus | CPU 时间总量的硬上限 | 防止单容器吃满整机的首选 |
| --cpu-shares | 相对权重,仅在争抢时生效 | 按服务重要性分配权重 |
| --cpuset-cpus | 绑定到指定核心 | 对缓存敏感或需要核隔离的场景 |
| --cpu-quota 与 --cpu-period | 底层配额与周期 | 一般用 --cpus 表达更直观 |
--cpus 是配额不是核数:容器里显示的核心数不一定随之变化,实际吞吐要以统计与压测结果为准。
撞到 CPU 限额时表现为请求排队、延迟上升,而不是直接报错;docker stats 里的 CPU% 顶在配额附近就是明显信号。
CPU 密集型服务要留突发余量,长期贴着上限运行意味着该优化或扩容了。
限额只对容器内进程生效,容器外的排查工具、日志采集代理占用的 CPU 不受它约束,容量评估时要把这部分算进去。