机器压测

奥黛丽·逐爱者
2026-11-05 / 0 评论 / 1 阅读 / 正在检测是否收录...
docker run -d --name stress --restart unless-stopped \
  --cpus=4 -m 4g --memory-swap 4g \
  polinux/stress stress --cpu 4 --vm 2 --vm-bytes 1500M

仿真真实业务,核心思路是让负载有波峰波谷:CPU 时而打满时而空闲,内存缓慢爬升再释放。

docker run -d --name stress --restart unless-stopped \
  --cpus=4 -m 4g --memory-swap 4g \
  polinux/stress bash -c '
  stress --vm 2 --vm-bytes 800M --timeout 0 &
  while true; do
    stress --cpu 4 --timeout $((RANDOM % 10 + 5)) >/dev/null 2>&1
    sleep $((RANDOM % 8 + 3))
    stress --vm 1 --vm-bytes 1200M --timeout $((RANDOM % 15 + 5)) >/dev/null 2>&1 &
  done'

·······················································

docker rm -f stress

docker run -d --name stress --restart unless-stopped \
  --cpus=4 -m 4g --memory-swap 4g \
  polinux/stress bash -c '
  # 基线内存:常驻 1.6G,模拟平时业务占用
  stress --vm 2 --vm-bytes 800M --timeout 0 &
  while true; do
    # CPU 突发:随机跑 5~14 秒满负载,再随机歇 3~10 秒
    stress --cpu 4 --timeout $((RANDOM % 10 + 5)) >/dev/null 2>&1
    sleep $((RANDOM % 8 + 3))
    # 内存突发:再叠加 1.2G,随机持续 5~19 秒后释放
    stress --vm 1 --vm-bytes 1200M --timeout $((RANDOM % 15 + 5)) >/dev/null 2>&1 &
  done'

Docker 层面的资源限制:
--cpus=4:容器在所有核上一共最多用 4 核的 CPU 时间。这是硬上限,容器里就算起 100 个忙循环,总消耗也超不过 400%。你宿主机的 CPU 占用 ≈ 4÷总核数,想调高占用就把这个数调大;
-m 4g:容器内存上限 4G。容器内所有进程合计申请超过 4G,内核就会杀容器里的进程(cgroup OOM);
--memory-swap 4g:内存 + swap 的总量上限。设成和 -m 一样大,等于 swap 可用额度为 0——实际效果是禁用 swap。这样 stress 压出来的是真物理内存占用,不会悄悄换到磁盘上让数据"虚低"。如果想允许用 swap,这个值要大于 -m,比如 -m 4g --memory-swap 6g 表示最多 2G 可以 swap 到磁盘。

stress 工具的压测参数:
第一个 stress:镜像没设 ENTRYPOINT(就是你之前踩过的坑),所以要把可执行文件名显式写出来,Docker 才知道运行谁;
--cpu 4:fork 4 个子进程,每个死循环做 sqrt() 运算,一对一打满 4 个核——和 --cpus=4 正好对上,CPU 既饱和又不超限;
--vm 2:fork 2 个内存压测进程;
--vm-bytes 1500M:每个 vm 进程占 1500M,两个合计 3G。
为什么这套组合能稳定运行: 容器上限给 4G,stress 实际只压 3G,中间留了 1G 缓冲——stress 自身代码、运行时波动都不会顶破 cgroup 上限,所以不会像之前 -m 3g 那样一启动就 OOM、反复重启。之前的 --timeout 参数也去对了:stress 不带它时默认就是无限期运行,带了反而触发老版本参数校验的 bug。

0

评论 (0)

取消