1. 为什么需要stress工具?
刚入行做运维那会儿,我最怕遇到系统莫名其妙崩溃的情况。有一次半夜被报警叫醒,发现线上服务响应缓慢,查了半天才发现是某个新上线的服务吃光了所有CPU资源。要是早点用stress做个压力测试,可能就能避免这次事故了。
stress就像个系统体检医生,它能给CPU、内存、磁盘这些关键部件施加压力,帮我们提前发现系统的"体能极限"。比如:
- 新服务器上线前,想知道它到底能扛多少并发?
- 系统扩容后,想确认新增的资源真的起作用了?
- 遇到性能瓶颈,想找出到底是CPU、内存还是磁盘拖了后腿?
这些场景下,stress都能大显身手。它最大的特点是操作简单但效果直接,几个命令就能让系统"大汗淋漓",配合top、htop这些监控工具,系统状态一目了然。
2. 快速安装stress工具
2.1 不同系统的安装方法
在CentOS 7上安装最简单,直接使用预编译的rpm包:
wget http://fr2.rpmfind.net/linux/dag/redhat/el7/en/x86_64/dag/RPMS/stress-1.0.2-1.el7.rf.x86_64.rpm rpm -Uivh stress-1.0.2-1.el7.rf.x86_64.rpm如果是较新的系统,建议用yum安装:
yum install -y epel-release yum install -y stress想要最新版的功能可以编译安装stress-ng(stress的增强版):
wget https://kernel.ubuntu.com/~cking/tarballs/stress-ng/stress-ng-0.15.06.tar.gz tar -xzf stress-ng-0.15.06.tar.gz cd stress-ng-0.15.06 make && sudo make install2.2 验证安装成功
装好后运行这个命令检查版本:
stress --version # 或者如果是stress-ng stress-ng --version3. CPU压力测试实战
3.1 基础CPU压力测试
想让CPU火力全开很简单:
stress -c 4这个命令会创建4个worker进程不停计算平方根,把CPU占满。数字4表示要占用的CPU核心数,根据你的机器配置调整。
测试时建议开两个终端窗口:
- 一个运行stress
- 一个运行htop观察CPU使用率
你会看到所有CPU核心都变成100%红色,就像这样:
CPU1 [||||||||||||||||||||||||||||||||||||||||||||||||||100.0%] CPU2 [||||||||||||||||||||||||||||||||||||||||||||||||||100.0%]3.2 高级CPU测试技巧
如果想更精确控制CPU负载,可以用stress-ng:
stress-ng --cpu 2 --cpu-load 80这个命令会让2个CPU核心保持在80%左右的负载,模拟真实业务场景。
还可以测试CPU缓存压力:
stress-ng --cache 2 --cache-level 1这个命令会专门对L1缓存施加压力,适合测试CPU密集型应用。
4. 内存压力测试详解
4.1 基础内存测试
模拟内存不足的场景特别有用:
stress --vm 4 --vm-bytes 1G --vm-keep这个命令会:
- 启动4个worker进程(--vm 4)
- 每个分配1GB内存(--vm-bytes 1G)
- 持续占用不释放(--vm-keep)
用free -h命令观察,会发现可用内存(available)快速下降。当内存不足时,系统会开始用swap,这时用top能看到swap使用量增加。
4.2 内存测试注意事项
- 不要一次性申请超过物理内存的量,否则可能触发OOM killer直接杀进程
- 测试时可以配合vmstat观察内存和swap变化:
vmstat 1 - 如果想模拟内存泄漏场景,可以去掉--vm-keep参数,让内存不断分配释放
5. 磁盘IO压力测试技巧
5.1 基础IO测试
这个命令会产生4个进程不停调用sync:
stress -i 4用iostat观察磁盘利用率:
iostat -x 1重点看%util这一列,数值越高表示磁盘越忙。
5.2 文件写入测试
更真实的测试是实际写文件:
stress -d 1 --hdd-bytes 10G这个命令会:
- 创建1个worker进程(-d 1)
- 每次写入10GB大小的文件(--hdd-bytes 10G)
配合iotop工具,可以清楚看到哪个进程在疯狂写磁盘:
iotop -o5.3 精准磁盘测速
stress的磁盘测试可能不够准确,这时可以用dd命令:
# 测试纯写入速度(写入缓存) time dd if=/dev/zero of=./testfile bs=1G count=1 oflag=direct # 测试真实磁盘写入速度 time dd if=/dev/zero of=./testfile bs=1G count=1 conv=fsync注意两者的区别:oflag=direct会绕过系统缓存,conv=fsync会在最后同步到磁盘。
6. 综合测试与监控技巧
6.1 同时测试多个资源
stress最强大的地方是可以组合测试:
stress -c 4 -m 2 --vm-bytes 1G -i 1 -d 1 --hdd-bytes 10G这个命令会同时:
- 占用4个CPU核心
- 占用2GB内存
- 产生1个IO进程
- 进行磁盘写入测试
6.2 推荐监控组合
测试时要多开几个终端窗口监控:
- CPU监控:
htop - 内存监控:
watch -n 1 "free -h" - 磁盘监控:
iostat -x 1 - 综合监控:
dstat -cmdr --disk-util
6.3 测试时长控制
默认stress会一直运行,可以用-t参数指定时长:
stress -c 4 -t 60s # 测试60秒测试完成后,所有资源会自动释放,系统应该恢复正常状态。如果发现资源没释放,可能是stress进程异常退出了,可以用ps aux | grep stress检查并手动kill掉。
7. 生产环境使用建议
- 不要在正在运行的业务服务器上直接测试,最好用专门的测试环境
- 测试前先保存重要数据,磁盘测试可能会写满磁盘
- 内存测试要循序渐进,避免直接触发OOM导致系统崩溃
- 测试时记录系统基线数据,方便对比分析
- 长期运行测试建议用nohup:
nohup stress -c 4 > stress.log 2>&1 & - 测试完成后记得清理测试文件:
rm -f testfile test.dd
我在实际工作中发现,很多性能问题都是资源竞争导致的。比如有一次发现服务响应慢,用stress单独测试CPU、内存都没问题,但组合测试时就出现卡顿,最后发现是磁盘IO瓶颈。所以建议大家多做组合测试,才能发现真正的系统瓶颈。