从零到精通:使用stress-ng对Linux系统进行全方位压力测试
1. 认识stress-ng你的Linux系统压力测试神器第一次接触stress-ng是在三年前的一个深夜当时我正在为公司的云服务器做上线前的最后测试。突然意识到如果这台机器在业务高峰期扛不住压力怎么办这时一位老运维扔给我一行命令stress-ng --cpu 8 --io 4 --vm 2从此打开了系统稳定性测试的新世界。stress-ng是stress工具的增强版就像瑞士军刀一样集成了各种系统压力测试功能。它能模拟CPU高负载、内存吃紧、磁盘疯狂读写等极端场景让我们提前发现系统的薄弱环节。与老版的stress相比stress-ng支持更复杂的测试场景比如同时测试多个子系统还能模拟特定类型的计算任务。在实际工作中我发现stress-ng特别适合这些场景新服务器上线前的烤机测试系统配置变更后的稳定性验证模拟突发流量时的资源瓶颈定位容器/K8s节点的资源限制测试2. 从零开始安装stress-ng2.1 准备编译环境我建议直接从源码编译安装这样可以获得最新版本的功能。在开始前我们需要准备好构建工具链# Ubuntu/Debian系统 sudo apt update sudo apt install -y build-essential # CentOS/RHEL系统 sudo yum groupinstall -y Development Tools遇到过一个小坑在某些最小化安装的系统上可能会缺少libaio等依赖库。这时可以补充安装sudo apt install -y libaio-dev libattr1-dev # Ubuntu sudo yum install -y libaio-devel libattr-devel # CentOS2.2 源码编译安装我习惯将这类工具安装在/opt目录下方便统一管理wget https://fossies.org/linux/privat/stress-ng-0.14.01.tar.gz tar -zxvf stress-ng-0.14.01.tar.gz cd stress-ng-0.14.01 make -j$(nproc) sudo make install安装完成后验证下版本stress-ng --version如果看到版本号输出恭喜你工具链已经就绪。我建议把这个路径加入PATH环境变量echo export PATH$PATH:/usr/local/bin ~/.bashrc source ~/.bashrc3. 系统摸底了解你的战场在开始压力测试前我们需要先摸清系统的硬件配置就像医生要先了解病人的基本情况才能开药。3.1 CPU信息侦查lscpu | grep -E Model name|Socket|Core|Thread这个命令会显示CPU型号、物理核数、逻辑线程数等关键信息。我曾经遇到过虚拟机的vCPU分配不足导致测试失真的情况所以特别要注意物理CPU插槽数Sockets每插槽核心数Cores per socket每核心线程数Threads per core3.2 内存容量检查free -h重点关注available列这才是系统实际可用的内存。有个经验值压力测试时最好不要超过可用内存的90%否则可能触发OOM killer。3.3 磁盘性能基准lsblk # 查看磁盘分区情况 df -h # 查看挂载点使用情况特别注意/tmp目录的空间是否足够某些测试会用到主要数据盘的I/O性能可以用fio先做基准测试如果是SSD注意预留足够的OP空间4. CPU压力测试实战4.1 基础CPU测试最直接的测试方式是让所有CPU核心满载运行stress-ng --cpu $(nproc) --timeout 180s这里用了$(nproc)自动获取CPU核心数。测试时可以另开一个终端观察watch -n 1 lscpu | grep CPU MHz这会实时显示每个核心的频率变化正常应该能看到频率飙升到最高睿频。4.2 高级CPU测试技巧stress-ng支持多种CPU压力算法stress-ng --cpu 4 --cpu-method all --timeout 120s这里的--cpu-method all会轮换使用各种计算算法matrixprod 矩阵乘积fft 快速傅里叶变换sqrt 平方根运算...我曾经用这个方法发现过某款CPU在特定计算类型下会出现异常升温的情况。4.3 温度监控要点长时间CPU满载需要注意散热问题。推荐安装lm-sensorssudo apt install lm-sensors # Ubuntu sudo yum install lm_sensors # CentOS sudo sensors-detect --auto sensors测试时要密切监控温度变化特别是温度上升曲线是否平稳是否触发热节流throttling风扇转速是否正常5. 内存压力测试详解5.1 基础内存测试stress-ng --vm 4 --vm-bytes 80% -t 5m这个命令会启动4个worker每个分配总内存80%的空间自动计算持续5分钟。我强烈建议使用百分比而非固定值这样脚本在不同机器上都通用。5.2 内存测试模式选择stress-ng提供多种内存访问模式stress-ng --vm 2 --vm-bytes 2G --vm-method rowhammer可选模式包括sequential 顺序访问random 随机访问rowhammer 模拟Rowhammer攻击...曾经用rowhammer模式在测试机上成功触发了ECC内存纠错提前发现了内存条质量问题。5.3 交换空间监控当内存不足时系统会使用swap空间。监控swap使用情况很重要watch -n 1 free -h; swapon --show如果发现swap使用量快速增长可能意味着物理内存不足swappiness设置过高内存泄漏在长时间测试中6. 磁盘I/O压力测试6.1 基础磁盘测试stress-ng --hdd 2 --hdd-bytes 10G -t 10m这会创建两个worker每个写入10GB临时文件。注意确保目标分区有足够空间建议至少20%余量不要在系统关键分区如/上测试测试文件默认存放在/tmp可以用--temp-path指定其他位置6.2 混合I/O模式stress-ng --io 4 --iomix 2 --iomix-bytes 1G -t 5m--iomix选项会混合多种I/O操作同步/异步写入文件元数据操作随机/顺序读写6.3 磁盘健康监控在进行高强度I/O测试时建议同时监控磁盘健康状态watch -n 5 sudo smartctl -a /dev/sda | grep -i temperature iostat -x 1 # 查看I/O等待和利用率特别警惕I/O等待持续高于50%磁盘温度异常升高出现重分配扇区计数增长7. 系统监控与结果分析7.1 实时监控三板斧测试时我习惯用这三个命令实时监控# CPU监控 htop # 内存监控 watch -n 1 free -m # 综合监控 dstat -cmdr --disk-util --top-cpu7.2 日志记录技巧为了后续分析建议将监控数据记录下来vmstat 1 60 vmstat.log iostat -x 1 60 iostat.log stress-ng --cpu 4 --timeout 60s7.3 常见问题诊断根据多年经验整理了几个典型问题现象现象可能原因验证方法CPU频率不升反降温度过高触发降频sensors turbostat内存测试OOMovercommit设置过严cat /proc/sys/vm/overcommit_memory磁盘I/O卡顿磁盘队列深度不足iostat -x 观察avgqu-sz8. 进阶综合场景测试8.1 模拟真实业务负载stress-ng --cpu 4 --io 2 --vm 2 --vm-bytes 2G --hdd 1 --timeout 1h这种混合测试能更好地模拟真实业务场景。建议逐步增加负载观察系统响应曲线。8.2 长时间稳定性测试对于关键业务服务器我通常会进行24小时以上的耐力测试stress-ng --all 2 --timeout 24h注意使用nohup或tmux保持会话设置合理的监控间隔如每5分钟记录一次准备自动报警机制如温度超过阈值自动停止8.3 容器环境测试在Docker中测试需要注意资源限制docker run -it --rm --cpus2 -m 2g ubuntu stress-ng --cpu 2 --vm 1 --vm-bytes 1G重点验证Cgroup限制是否生效容器内外的监控数据是否一致OOM Killer行为是否符合预期记得第一次在生产环境使用stress-ng时我意外发现了一批服务器的内存兼容性问题。从那时起这就成了我的标准测试工具。建议把关键测试命令写成脚本纳入你的运维工具库。测试不是为了证明系统会失败而是为了了解它会在什么情况下失败——这样我们才能真正掌控自己的系统。