当服务器突然卡顿,或是新上线业务面临流量高峰时,大多数运维工程师的第一反应是打开top或htop查看CPU和内存占用。但真实的生产环境瓶颈往往隐藏在更复杂的复合型压力下——可能是磁盘IOPS饱和,也可能是内存带宽不足,甚至是CPU缓存命中率下降。本文将带你用stress-ng这套工业级压力测试工具,配合iostat、perf等监控利器,构建一套完整的系统健壮性评估方案。
想象一个场景:你负责的电商平台即将迎来双十一大促,虽然已通过ab测试了接口吞吐量,但凌晨流量峰值时依然出现了数据库响应超时。事后排查发现,问题根源在于高并发查询导致磁盘随机读写延迟飙升——这种复合型瓶颈很难通过常规监控提前发现。
stress-ng不同于基础版stress,它能模拟超过280种压力场景,包括:
提示:生产环境压测务必在业务低峰期进行,避免影响线上服务
对于不同Linux发行版,推荐以下安装方式:
| 发行版 | 安装命令 |
|---|---|
| Ubuntu/Debian | sudo apt install stress-ng |
| RHEL/CentOS | sudo yum install epel-release && sudo yum install stress-ng |
| 源码编译 | wget https://kernel.ubuntu.com/~cking/tarballs/stress-ng/XXX.tar.gz && tar -xzvf XXX.tar.gz && cd stress-ng-XXX && make && sudo make install |
验证安装成功:
bash复制stress-ng --version
# 预期输出示例:stress-ng 0.13.02
bash复制# 启动4个worker进行矩阵运算,持续60秒
stress-ng --matrix 4 -t 60s
# 实时监控CPU温度(需lm-sensors)
watch -n 1 "sensors | grep 'Core'"
bash复制# 分配16GB内存,测试带宽和延迟
stress-ng --vm 2 --vm-bytes 8G --vm-method rowhammer -t 5m
bash复制# 创建4个worker进行随机写操作(每次4K)
stress-ng --hdd 4 --hdd-opts direct,random,4k -t 120s
电商后台典型压力组合:
bash复制stress-ng \
--cpu 4 --cpu-method fft \ # 模拟计算型任务
--vm 2 --vm-bytes 6G \ # 占用部分内存
--io 3 \ # 产生IO压力
--hdd 1 --hdd-opts sync,4k \ # 同步写入小文件
--timeout 300s
推荐使用tmux分屏同时观察:
bash复制# 窗口1:综合监控
watch -n 1 "echo '====CPU===='; lscpu | grep 'MHz'; echo '====MEM===='; free -h; echo '====IO===='; iostat -dx 1 3"
# 窗口2:进程级监控
htop -d 5 --sort-key PERCENT_CPU
# 窗口3:性能事件统计
perf stat -d -p $(pgrep stress-ng)
关键指标解读:
%steal(虚拟机环境)和MHz(是否降频)dirty比例过高可能引发IO瓶颈await>10ms需警惕保存为stress_test.sh:
bash复制#!/bin/bash
LOG_FILE="/var/log/stress_test_$(date +%Y%m%d).log"
# 参数定义
DURATION=300 # 测试时长(秒)
CPU_WORKERS=4
MEM_WORKERS=2
MEM_SIZE="8G"
IO_WORKERS=3
{
echo "==== 开始系统压力测试 $(date) ===="
echo "---- CPU基准测试 ----"
stress-ng --cpu $CPU_WORKERS --cpu-method matrixprod -t $DURATION
echo "---- 内存带宽测试 ----"
stress-ng --vm $MEM_WORKERS --vm-bytes $MEM_SIZE --vm-method rowhammer -t $DURATION
echo "---- 混合负载测试 ----"
stress-ng \
--cpu $CPU_WORKERS \
--vm $MEM_WORKERS --vm-bytes $MEM_SIZE \
--io $IO_WORKERS \
--timeout $DURATION
} | tee -a $LOG_FILE
赋予执行权限:
bash复制chmod +x stress_test.sh
nohup ./stress_test.sh > /dev/null 2>&1 &
在金融级系统中,建议设置以下熔断机制:
bash复制# 当CPU温度超过85℃时自动终止
stress-ng --cpu 4 --temperature --temperature-max 85
# 内存使用不超过总容量的80%
stress-ng --vm 1 --vm-bytes $(free -m | awk '/Mem/{print int($2*0.8)}')M
常见避坑指南:
%steal过高可能表示宿主机资源不足