Docker 性能分析
Linux 系统性能分析递进到 Docker 性能分析
Docker 性能分析
未更新完
1. Docker 容器性能监控的分层认知
在讲工具之前,先明确一个关键前提:
容器性能 ≠ 主机性能
容器的资源统计,本质来自 Linux cgroup + namespace,而不是传统的 top / vmstat / iostat。
监控能力可分为 4 层:
| 层级 | 能看到什么 | 典型工具 |
|---|---|---|
| L0 | 容器资源汇总 | docker stats |
| L1 | cgroup 精细指标 | cAdvisor |
| L2 | 历史 + 可视化 | Prometheus + Grafana |
| L3 | 系统调用 / 行为 | Sysdig / eBPF |
| L4 | 应用指标 | 应用自身埋点 |
你给的方案基本覆盖 L0 → L3,非常完整。
2. docker stats —— 容器监控的“入口工具”
2.1. 原理
docker stats 直接读取 Docker Engine 维护的 cgroup 统计信息:
/sys/fs/cgroup/cpu/docker/<id>//sys/fs/cgroup/memory/docker/<id>/
并做一次简单聚合展示。
2.2. 能看什么
1
docker stats --no-stream
| 指标 | 说明 |
|---|---|
| CPU % | 容器 CPU 使用率(已考虑多核) |
| MEM USAGE | 当前内存 / 限制 |
| NET I/O | 网络收发 |
| BLOCK I/O | 磁盘读写 |
⚠️ CPU% 计算方式
容器 CPU 时间 / 宿主总 CPU 时间 所以多核机器上可能 >100%
2.3. 适用场景
✅ 本地调试 ✅ 临时排查“哪个容器吃资源” ❌ 不适合线上长期监控
2.4. 明确的局限
- ❌ 无历史
- ❌ 无告警
- ❌ 无 per-process(看不到容器内部进程)
👉 结论:只能作为“第一眼工具”
3. cAdvisor —— Docker 容器监控的事实标准
3.1. cAdvisor 是什么
Google 开源的 Container Advisor:
专门从 cgroup + fs + netns 采集容器级别资源指标
Kubernetes 早期版本 内置就是 cAdvisor。
3.2. 启动参数为什么这么写(重点)
1
2
3
4
5
6
7
8
9
docker run -d \
--name cadvisor \
--privileged \
--volume /:/rootfs:ro \
--volume /var/run:/var/run:ro \
--volume /sys:/sys:ro \
--volume /var/lib/docker/:/var/lib/docker:ro \
--publish 8080:8080 \
gcr.io/cadvisor/cadvisor:latest
逐项解释(非常关键):
| 参数 | 作用 |
|---|---|
--privileged |
读取 cgroup / proc |
/sys |
CPU / memory / blkio |
/var/lib/docker |
容器元数据 |
/var/run |
docker.sock |
/ |
文件系统容量统计 |
⚠️ 这是“只读挂载”,风险可控
3.3. 能看到哪些核心指标
CPU
- 使用率(按核)
- throttling(是否被限速)
内存
- RSS
- Cache
- Limit
- OOM Kill 次数(非常重要)
网络
- rx / tx bytes
- packets / drops
磁盘
- read/write bytes
- IOPS
3.4. cAdvisor 的定位
| 能 | 不能 |
|---|---|
| 精确容器资源 | 应用 QPS |
| Prometheus Export | 延迟、错误率 |
| OOM 诊断 | 业务 SLA |
👉 结论:资源层最优解
4. Prometheus + Grafana —— 生产级必选
4.1. 典型架构
1
[cAdvisor] ---> [Prometheus] ---> [Grafana]
- cAdvisor:采集
- Prometheus:存储 + 查询
- Grafana:可视化 + 告警
4.2. 关键指标示例(PromQL)
# 容器 CPU 使用率
rate(container_cpu_usage_seconds_total[5m])
# 容器内存使用
container_memory_working_set_bytes
# OOM 次数
container_oom_events_total
4.3. 为什么这是“生产方案”
✅ 有历史 ✅ 可告警 ✅ 可容量规划 ✅ 可做 SLO / 趋势分析
5. Sysdig / Falco —— 行为级、内核级分析
5.1. Sysdig 在看什么
它不是“资源监控”,而是:
系统调用级别的行为分析
基于:
- 内核模块(旧)
- eBPF(新)
5.2. 示例命令的含义
1
sysdig -pc cont.id=abc123 and evt.type in (open,read,write,connect)
= 只看某个容器的:
- 文件打开
- IO 读写
- 网络连接
5.3. 适用场景(非常明确)
✅ 容器异常行为 ✅ 安全审计 ✅ “容器为什么突然卡死”
❌ 日常资源监控
6. ctop —— 人类友好的实时工具
6.1. 本质
- 基于 Docker API
- 类似
htop,但对象是 container
6.2. 特点
| 优点 | 缺点 |
|---|---|
| 实时交互 | 无历史 |
| 快速定位 | 不适合线上 |
| 人性化 | 只是 UI |
👉 结论:开发 / 运维的“增强版 docker stats”
7. Docker 使用国内镜像源(生产必配)
7.1. 官方推荐方式(daemon.json)
编辑:
1
2
sudo mkdir -p /etc/docker
sudo vim /etc/docker/daemon.json
推荐配置(稳定)
1
2
3
4
5
6
7
8
9
10
11
12
{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://mirror.ccs.tencentyun.com",
"https://hub-mirror.c.163.com"
],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
}
}
重启 Docker:
1
2
sudo systemctl daemon-reexec
sudo systemctl restart docker
7.2. 验证是否生效
1
docker info | grep -A 5 "Registry Mirrors"
7.3. 重要说明(现实情况)
| 镜像源 | 现状 |
|---|---|
| 阿里云 | 需登录 |
| 中科大 | 稳定 |
| 腾讯云 | 稳定 |
| 网易 | 稳定 |
⚠️ gcr.io 镜像(如 cAdvisor) 建议:
1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/cadvisor:v0.49.1
本文由作者按照
CC BY 4.0
进行授权