Linux系统稳定性守护者:stress工具实战CPU、内存与IO压力测试

张开发
2026/5/22 15:44:13 15 分钟阅读
Linux系统稳定性守护者:stress工具实战CPU、内存与IO压力测试
1. 为什么你需要stress这个系统体检医生刚入行做运维那会儿我最怕的就是服务器半夜报警。明明白天测试一切正常怎么一到流量高峰就CPU爆满、内存泄漏后来 mentor 教我个绝招——用 stress 工具主动给系统找茬。这就像体检时医生让你做负重测试故意在跑步机上加大坡度才能发现潜在的心脏问题。stress 本质上是个压力发生器它能精准制造三种系统资源危机CPU过载模拟多核并发运算内存饥渴快速吞噬可用内存磁盘IO风暴制造读写洪峰我经手的服务器在上线前必须经过这三重考验。有次给电商客户做618备战就是用 stress 提前暴露了内存分配策略缺陷避免了大促期间OOM内存溢出的灾难。2. 快速部署stress的三种姿势2.1 RPM包安装CentOS专属对于CentOS 7用户最省事的方法是直接安装预编译包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镜像源。我遇到过安全策略严格的金融客户最终是通过下载rpm包到内网搭建本地仓库解决的。2.2 源码编译安装通用方案如果需要最新版或自定义功能推荐stress-ng新一代增强版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 install编译过程可能会报缺少zlib等依赖记得用yum install zlib-devel补全。去年给某AI实验室部署GPU服务器时就是靠stress-ng的--matrix参数成功触发了CUDA核心的满载测试。2.3 yum一键安装最懒人方案EPEL源提供了开箱即用的版本yum install -y epel-release yum install -y stress适合测试环境快速验证但版本可能较旧。曾经有同事用这个方式安装后发现缺少--hdd-noclean参数导致测试文件无法自动清理把/tmp分区撑爆了...3. CPU压力测试让你的处理器燃烧起来3.1 基础压力测试最简单的CPU烤机命令stress -c 4 # 启动4个worker疯狂计算这时候打开htop会看到所有CPU核心飙红就像这样CPU[||||||||||||||||||||100%] CPU[||||||||||||||||||||100%] CPU[||||||||||||||||||||100%] CPU[||||||||||||||||||||100%]3.2 进阶玩法绑定特定CPU核心有时候需要测试CPU亲和性配置是否生效taskset -c 0,2 stress -c 2 # 只使用第0和第2号核心这个技巧在调试NUMA架构时特别有用。去年排查某数据库性能问题时就是通过这种方式发现跨NUMA节点访问导致30%的性能损失。3.3 实战经验别被CPU使用率骗了有一次客户说CPU已经100%但系统不卡用mpstat -P ALL 1一看CPU %usr %sys %iowait all 12.34 0.56 87.10原来stress的-i参数制造的是IO等待型负载。真正的计算密集型测试应该配合--cpu-method指定算法stress-ng --cpu 4 --cpu-method fft # 使用快速傅里叶变换算法4. 内存测试制造内存饥饿现场4.1 基础内存填充最暴力的测试方式stress --vm 2 --vm-bytes 2G --vm-keep这会产生两个worker每个吃掉2GB内存总共4GB。关键参数说明--vm-keep保持内存驻留而不是不断分配/释放--vm-hang 60分配后保持60秒模拟内存泄漏4.2 实战踩坑OOM Killer触发机制有次测试32GB内存的服务器执行stress --vm 16 --vm-bytes 4G理论上应该占用64GB但系统居然没崩溃原来Linux的overcommit机制在骗程序。要真实测试OOM行为需要sysctl vm.overcommit_memory2 echo 1 /proc/sys/vm/overcommit_ratio4.3 高级技巧测试swap性能强制让系统用上swap分区stress --vm 1 --vm-bytes $(free -m | awk /Mem/{print $2})M然后用sar -B 1观察page in/out变化。某次性能调优就发现swapiness设置过高导致性能下降50%。5. 磁盘IO压测让你的硬盘冒烟5.1 基础IO测试最简单的磁盘写入测试stress -d 1 --hdd-bytes 1G但要注意这可能会写满磁盘我习惯加个清理参数stress-ng --hdd 1 --hdd-bytes 1G --hdd-noclean5.2 精准测量dd与stress组合拳想要更精确的磁盘性能数据可以配合dd# 测试写入速度同步模式 time dd if/dev/zero of./testfile bs1G count1 oflagdirect # 测试读取速度 hdparm -Tt /dev/sda5.3 企业级实战RAID卡缓存测试某次金融系统性能评估中我们需要测试RAID卡BBU电池备份单元的缓存效果stress-ng --hdd 4 --hdd-opts direct,dsync通过对比有缓存和无缓存模式的iostat输出最终确定了写入策略的最佳配置。6. 监控与分析压力测试的听诊器6.1 经典监控三板斧CPU监控mpstat -P ALL 1 # 查看每个核心的详细利用率内存监控watch -n 1 free -m # 实时内存变化IO监控iostat -xmdz 1 # 显示await、%util等关键指标6.2 性能瓶颈定位案例某次测试发现%sys过高用perf top看到42.3% [kernel] [k] _raw_spin_lock_irqsave 18.7% [kernel] [k] __d_lookup最终定位到是ext4文件系统锁竞争导致改用xfs后性能提升35%。7. 企业级压力测试方案设计7.1 测试场景编排典型的三阶段测试法# 阶段1CPU内存综合测试 stress -c 4 --vm 2 --vm-bytes 2G --timeout 10m # 阶段2加入磁盘IO stress-ng --cpu 4 --vm 2 --vm-bytes 2G --hdd 1 --timeout 10m # 阶段3极限压力 stress-ng --cpu 8 --vm 4 --vm-bytes 4G --hdd 2 --io 4 --timeout 5m7.2 自动化测试脚本示例这是我常用的巡检脚本框架#!/bin/bash LOGstress_$(date %Y%m%d).log echo CPU测试开始 $LOG stress -c 4 --timeout 60s mpstat -P ALL 1 60 $LOG echo 内存测试开始 $LOG stress --vm 2 --vm-bytes 2G --timeout 60s vmstat 1 60 $LOG8. 避坑指南那些年我踩过的雷不要在生产环境直接测试曾经有运维同事误操作导致线上数据库服务器宕机注意磁盘空间--hdd-bytes参数会真实占用空间测试完记得清理温度监控很重要某次CPU压力测试触发了主板过热保护区分压力类型计算密集型矩阵运算和IO密集型文件操作对系统的影响完全不同测试前保存状态建议先用sar -u -r -d -n DEV 1 60 before.log记录基线数据

更多文章