stress未安装需按发行版选择对应命令:Ubuntu/Debian用apt,CentOS/RHEL先启EPEL再yum/dnf,Alpine等用docker;安装后须运行stress --version验证,注意区分stress与stress-ng。

stress 命令没装?先确认发行版再装对包
很多新手在 stress --version 报 “command not found” 时直接搜“怎么安装 stress”,结果在 CentOS 上用 apt install stress 白忙活——这是包管理器用错了。
- Ubuntu/Debian 系统:运行
sudo apt install stress - CentOS/RHEL 7+:必须先启用 EPEL,再装,命令是
sudo yum install epel-release && sudo yum install stress(RHEL 8+ 改用dnf) - 某些最小化安装的系统(如 Alpine 或 CoreOS)压根不带包管理器,推荐用容器临时跑:
docker run --rm -it jess/stress stress --cpu 2 --timeout 10s
别跳过验证步骤:装完立刻执行 stress --version,输出类似 stress-ng 0.14.05 才算真正就位。注意:系统自带的 stress 和社区更活跃的 stress-ng 是两个工具,参数不完全兼容,本文默认指经典 stress(v1.0.x 系列)。
模拟 CPU 高负载:别只写 --cpu 4,得看核数和目的
执行 stress --cpu 4 后发现 top 里 CPU 使用率才 40%,不是工具失效,而是你没对齐物理核心数。stress 的每个 --cpu N 进程会独占一个逻辑 CPU(即超线程后的 core),但它不做亲和性绑定,调度器可能把它挤到同一颗物理核上。
- 查真实可用逻辑 CPU 数:用
nproc或lscpu | grep "^CPU(s):" - 想压满所有 CPU:设
N为nproc输出值,例如 8 核 16 线程就用stress --cpu 16 - 只想测单核极限?加
--cpu 1+taskset -c 0 stress --cpu 1锁定到 CPU 0 - 必须加
--timeout:否则进程常驻,容易忘关,stress --cpu 8 --timeout 30s是安全底线
注意:它跑的是浮点开方循环(sqrt(rand())),不触发内存分配或系统调用,所以 %sys 几乎为 0——这正是你要的“纯计算压测”,但不代表能反映 Java 应用的 GC 压力。
内存压力不是“多开几个 -m 就行”,关键在 --vm-bytes 和释放行为
stress --vm 2 默认会让两个进程反复 malloc()/free(),看着 free -h 里 available 内存波动,但实际很难撑住——因为分配后立刻释放,内核很快回收,根本压不出 OOM 或 swap。
- 要稳定吃内存:加
--vm-keep,例如stress --vm 1 --vm-bytes 2G --vm-keep,这会让一个进程持续占住 2GB 不放 - 想模拟缓慢泄漏:用
--vm-hang 5,分配后休眠 5 秒再释放,循环往复,内存占用呈阶梯上升 - 避免误判:
--vm-bytes单位是字节,1G要写成1G(支持 K/M/G/T 后缀),别写成1024M——后者会被当 1024 字节处理 - 小心 OOM killer:如果总分配量超过物理内存 + swap,内核可能杀掉你的 ssh 进程,建议提前用
sudo sysctl vm.overcommit_memory=2控制分配策略
磁盘 IO 压测同理:--io 只调 sync(),刷脏页;而 --hdd 才真写文件,但默认文件大小只有 1GB,--hdd-bytes 10G 才够塞满 SSD 缓存层。
混合压测时参数顺序无关,但资源冲突必须手动隔离
执行 stress --cpu 4 --vm 2 --io 1 --timeout 60s 看起来很全面,但实际可能 CPU worker 抢光了调度时间,IO worker 根本没机会调 sync(),导致磁盘负载远低于预期。
- 观察指标要分层:用
htop看整体 CPU,用iostat -x 1看 %util 和 await,用free -h看 available 是否跌破警戒线 - 避免干扰:不要在压测机上同时跑监控 Agent(如 Prometheus node_exporter),它的采集本身就会引入额外负载
- 更可控的做法:分阶段压,比如先
--cpu 8 --timeout 30s,等系统恢复再--vm 2 --vm-bytes 4G --vm-keep --timeout 30s,最后叠加--io 2 - 真正生产级混压?换
stress-ng,它支持--metrics-brief输出结构化指标,也允许按权重配比各类 worker
stress 的本质是“让资源显形”,不是替代业务压测。它暴露的是硬件和内核瓶颈,比如 CPU 频率降频、内存带宽打满、NVMe 队列深度溢出——这些信号一旦错过,后续用 JMeter 或 wrk 压应用层时,问题根源就藏得更深了。

















