docker stats是最直接精准的容器cpu监控方式,读取cgroups底层cpuacct.usage和/proc/stat原始数据,cpu%为等效单核占用率(如4核机跑满2核显示约200%),默认5秒采样致短时尖峰漏捕率约63%,可通过watch -n 0.5配合--no-stream提升敏感度。

cpuacct.usage 和系统 /proc/stat 原始数据,不是估算值,也不是进程级采样(如 top),而是容器级真实物理 CPU 时间片占用。
CPU% 的真实含义要搞清
显示的 CPU% 是“等效单核占用率”,已归一化为单核 100% 基准:
– 在 4 核机器上,容器独占 1 个核 → 显示约 100%
– 容器并行跑满 2 个核 → 显示约 200%(完全正常,不是错误)
– 它不表示“占总核数百分比”,而是“用了多少个核 × 100%”的线性叠加
避免默认刷新带来的漏捕
docker stats 默认每秒刷新显示,但 Docker daemon 实际采样间隔约 5 秒,对毫秒级 CPU 尖峰捕获率低(实测漏捕率约 63%)。要提升敏感度:
– 用 watch -n 0.5 缩短轮询间隔(最小约 0.3 秒)
– 加 --no-stream 关闭流式缓冲,确保每次都是新快照
– 用 --format 精简输出,聚焦关键字段
示例命令:watch -n 0.5 'docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}" api-server'
连续几帧看到 CPU% 从 1.2% 跳到 94.7% 再回落,就是真实物理抢占的明确信号。
确认数据可读的关键前提
若始终显示 0.00% 或数值异常偏低,需排查:
– 容器必须处于 running 状态(stopped 容器无统计)
– 某些发行版(如 snap 安装的 Docker)或 CentOS/RHEL 8+(启用 cgroup v2)可能需要启动容器时加 --privileged,或运行 stats 时加 --cgroup-parent=/docker
– 不要混淆 MEM%:它仅在设置了 --memory 限制时才有意义;CPU% 则始终有效,无需额外限制
需要更高精度或长期记录?换工具链
docker stats 适合人工盯梢、快速诊断和脚本快查。
若需毫秒级采样、历史趋势绘图、阈值告警或聚合分析:
– 用 cAdvisor 暴露指标端点
– 配合 Prometheus 抓取 + Grafana 可视化
– 这套组合能还原 CPU 使用的完整时间序列,弥补 docker stats 的采样盲区











