Docker容器内存压力测试需在Running状态下进行,以验证内存边界、排查OOM或评估资源限制有效性;须确认内存限制与使用情况,使用cgroup视图工具(如dd、memtester或Python脚本)安全压测,并通过cgroup指标和dmesg监控OOM事件。

当Docker容器处于Running状态时,直接在容器内进行内存压力测试,是验证应用内存边界、排查OOM(Out of Memory)问题或评估资源限制有效性的常用手段。关键在于:测试要真实反映容器视角的内存视图,且不能干扰宿主机或其他容器。
确认容器内存限制与当前使用情况
在开始测试前,先明确容器是否设置了内存限制(--memory),以及当前实际占用。否则压力测试可能触发OOM Killer,导致容器意外退出。
- 查看容器内存限制:docker inspect -f '{{.HostConfig.Memory}}' <container_id>(单位为字节,0表示无限制)
- 查看实时内存使用:docker stats <container_id> 或进入容器执行 free -h(注意:容器内看到的是cgroup限制后的视图)
- 检查cgroup内存路径(容器内):cat /sys/fs/cgroup/memory/memory.limit_in_bytes,该值决定“可用内存上限”
在容器内安全执行内存压力测试
推荐使用轻量、可控、不依赖复杂环境的工具。避免用stress-ng --vm等可能绕过cgroup限制或引发内核级异常的方式;优先选择基于malloc + memset的简单压测逻辑。
- 若容器内已安装dd和sh:可快速分配并锁定内存
dd if=/dev/zero of=/dev/shm/testfile bs=1M count=500 && sync(占用500MB,/dev/shm受memory limit约束) - 使用memtester(需提前安装):memtester 300M 1(测试300MB,1轮,不会持续增长)
- 编写简易Bash脚本模拟渐进式占用(推荐):
python3 -c "a = 'x' * (800*1024*1024); input('Press Enter to release...')"(分配800MB后暂停,便于观察OOM前状态)
监控与判断是否触发内存压力
仅看容器内free输出容易误判。真正有效的观察点是cgroup指标和内核事件。
- 宿主机上实时查看容器cgroup内存统计:cat /sys/fs/cgroup/memory/docker/<container_id>/memory.usage_in_bytes
- 检查是否发生内存回收:cat /sys/fs/cgroup/memory/docker/<container_id>/memory.stat | grep -E "(pgpgin|pgpgout|pgmajfault)"(数值明显上升说明频繁换页或缺页)
- 监听OOM事件:dmesg -t | grep -i "killed process" | tail -5(出现即表示OOM Killer已介入,容器进程被杀)
- 观察docker ps输出状态:若容器从Up X seconds变为Restarting (137),大概率是OOM退出(137 = SIGKILL)
注意事项与避坑提示
内存压力测试不是跑满就完事,目标是复现真实瓶颈并获取可观测数据。
- 不要在生产容器中直接运行无限制的内存分配命令(如yes > /dev/null &配大内存分配)
- 启用--memory-swap=0时,容器无法使用swap,压力更易触发OOM,测试前需知悉
- Alpine镜像默认不含/proc/sys/vm/swappiness,无法通过调参缓解压力,应以cgroup limit为准
- Java等JVM应用需额外关注-Xmx设置是否超过容器memory limit,否则JVM可能因申请不到内存而崩溃,而非被cgroup OOM Kill










