- 目录
- 1. 工具定位与适用边界
- 2. 平台选择与安装
- 3. 核心概念与参数速查
- 4. 安全准备与停止方法
- 5. 实验前基线与监控
- 6. 分级实验清单
- 7. 如何阅读结果
- 8. 可复现实验与日志保存
- 9. 故障定位速查
- 10. 实验记录模板
- 11. 官方资料与后续方向
stress-ng 调查与实验手册 Tips (AI 汇总)
目录
1. 工具定位与适用边界
stress-ng(stress next generation)是 Colin Ian King 主导开发的开源系统压力测试工具,许可证为 GPL-2.0-or-later。它是对传统 stress 的独立重实现和扩展,不是两者完全兼容的替换品。
官方 README 在本次调查版本中列出 390+ stress tests;这不代表每台机器都能运行全部测试。实际能力取决于操作系统、CPU 指令集、内核、编译选项、依赖库和权限。
1.1 适合做什么
| 目标 | 用法 | 重点观察 |
|---|---|---|
| 硬件稳定性初筛 | CPU、内存、缓存持续负载 | 温度、降频、计算校验失败、机器重启、硬件错误日志 |
| 内核与系统接口验证 | 内存映射、调度、IPC、文件系统、socket 等 stressor | syscall 错误、hung task、内核告警、资源回收 |
| 压力下的应用行为 | 在受控资源范围内加载,同时运行真实业务 | 延迟分位数、吞吐、超时率、错误率 |
| 配置或版本变化观察 | 固定命令、版本和资源配额,重复 A/B 实验 | 同类 stressor 指标变化及系统监控差异 |
| 容器资源限制验证 | 配合 cgroup / 容器限制 | throttling、OOM、资源上限、宿主机影响 |
1.2 不应当用来证明什么
- 不是精密基准测试套件:官方明确反对将 bogo ops 当作可靠的性能跑分。
- 不能把不同 stressor 的 bogo ops/s 横向比较,也不能直接解释为 FLOPS、IOPS 或 MB/s。
- 一次测试成功不能证明“硬件绝对可靠”;VM 测试也不能保证覆盖所有物理内存。
- 本机 socket 压力不等于真实网络链路带宽或远端服务容量。
- 通用合成负载不能替代数据库、HTTP 服务或真实业务负载测试。
| 工具 | 与 stress-ng 的分工 |
|---|---|
stress |
简单 CPU、内存、I/O 压力;选项与 stress-ng 不宜混用 |
fio |
存储 IOPS、带宽、延迟分布与可控 I/O 模型 |
iperf3 |
两端网络吞吐测量 |
sysbench |
部分通用基准与数据库工作负载 |
| Memtest86 / Memtest86+ | 启动环境下更系统的物理内存检查,支持平台需另行确认 |
perf、vmstat、iostat |
观测工具,与 stress-ng 配合分析瓶颈 |
2. 平台选择与安装
2.1 选择实验平台
| 平台 | 建议 | 边界 |
|---|---|---|
| 原生 Linux 测试机 | 首选,尤其是内核、cgroup、NUMA、I/O 实验 | 仍受内核版本、权限与依赖影响 |
| Linux 虚拟机 | 适合学习命令、验证流程和资源限制 | 结果包含虚拟化影响;不能直接归因于物理硬件 |
| macOS 原生 | 适合支持的 CPU、内存等基础实验 | Linux 专用 stressor、/proc、cgroup、perf 等不可照搬 |
| macOS 上的 Docker | 可练习 Linux 用户态测试 | Docker Desktop 通常通过 Linux VM 运行,测的是 VM / 容器及其配额 |
| Linux 容器 | 适合隔离实验、验证 cgroup 行为 | 与宿主机共享内核;容器不是硬件安全隔离边界 |
Apple Silicon 有不同性能特性的核心。macOS 调度与 Linux 的 CPU 编号、亲和性机制也不同,不要把 Linux --taskset 实验直接搬到 macOS。
2.2 包管理器安装
以下为安装示例,不需要为普通测试使用 root;sudo 仅用于软件安装。
Debian / Ubuntu:
sudo apt update
sudo apt install stress-ng
需要外部监控时,可另装 sysstat(提供 iostat、mpstat)、lm-sensors(视硬件提供温度读数)。使用发行版仓库通常比直接添加第三方源更容易管理。
Fedora / 支持相应仓库的 RHEL 系发行版:
sudo dnf install stress-ng
RHEL 系发行版可能需要组织允许的额外仓库;包不存在时先查仓库,不要默认启用未知软件源。
macOS / Homebrew:
brew install stress-ng
本次查询的 Homebrew stable 版本为 0.22.01,提供 ARM64 bottle。实际安装版本与可用平台以公式页面为准。
安装后确认:
stress-ng --version
stress-ng --help
stress-ng --stressors
stress-ng --verifiable
man stress-ng
--stressors 是测试名称清单,不是“这些测试都可在当前环境成功运行”的保证。
2.3 源码构建:需要固定版本时使用
Linux 上先安装 Git、make、C/C++ 编译器;Debian / Ubuntu 的基础依赖可使用:
sudo apt install git build-essential
git clone --branch V0.22.01 --depth 1 https://github.com/ColinIanKing/stress-ng.git stress-ng-src
cd stress-ng-src
make -j2
./stress-ng --version
macOS 需要 Xcode Command Line Tools;上游给出的构建方式为 make clean、make。源码目录更新后应重新 make clean,避免使用过期的特性探测结果。
依赖库不齐全时,上游构建通常会禁用相应功能,不代表完整功能构建。追求覆盖面时,按官方 README 的平台依赖清单补齐,并记录 --buildinfo 与 --config 输出。可直接使用 ./stress-ng,不必安装到系统目录。
2.4 容器入口:先只查看帮助
docker run --rm ghcr.io/colinianking/stress-ng --help
这是官方 README 提供的滚动镜像入口,不是固定的 V0.22.01 镜像。正式复现时记录镜像 digest,并使用 digest 固定镜像。
首次压力实验应显式设置 CPU / 内存限制;先执行容器内 --dry-run。不要一上来加入 --privileged、宿主机设备映射或可写业务目录挂载。容器 CPU 限额不一定改变程序探测到的 CPU 数量,因此不要用 --cpu 0 代替显式 worker 数。
3. 核心概念与参数速查
3.1 stressor、worker、method、class
- stressor:一种压力生成器,如
cpu、vm、hdd、sock。 - worker:该 stressor 的并发实例。某些实例还会创建额外子进程或线程,因此
--sock 1不等于只有一个进程。 - method:stressor 内部算法,如
--cpu-method sqrt、--vm-method write64。 - class:类别标签,如
cpu、memory、filesystem、network、scheduler。一个 stressor 可属于多个类别。
基础结构:
stress-ng --cpu 2 --cpu-method sqrt --timeout 30s --verify --metrics-brief
同时指定多个 stressor 时,默认并发运行:
stress-ng --cpu 1 --vm 1 --vm-bytes 128M --timeout 30s --metrics-brief
3.2 关键参数
| 参数 | 含义 | 使用提醒 |
|---|---|---|
--cpu N、--vm N、--hdd N |
启动指定数量的对应 worker | 初次用 1,不要凭逻辑 CPU 数给所有测试开满 |
worker 数 0 |
使用系统配置的 CPU 数;无法确定时回退在线 CPU 数 | 不是“零个 worker”,也不是 cgroup 限额 |
| worker 数负值 | 使用在线 CPU 数 | Linux 亲和性、容器限额与在线 CPU 数是不同概念 |
--timeout 30s |
请求运行时长,可用 s、m、h 等单位 |
默认 24 小时;0 表示无超时;清理或阻塞可延迟结束 |
--cpu-method sqrt |
固定 CPU 算法 | 默认 all 会轮换方法,不利于算法级对比 |
--cpu-load 50 |
CPU worker 的目标忙闲比例 | 只作用于 cpu stressor,不控制 matrix 等其他测试 |
--vm-bytes 256M |
内存压力容量 | V0.22.01 为所有 vm worker 的总量,见下节 |
--vm-keep |
保留映射、反复改写 | 不等于锁定物理内存;无此选项时更侧重映射/解映射 |
--hdd-bytes 128M |
每个 hdd worker 的文件写入规模 | 不是整个测试的累计写入上限 |
--temp-path PATH |
临时目录根路径 | 默认当前工作目录;必须显式选择可写测试目录 |
--verify |
对支持的测试执行结果校验 | 不是所有 stressor 都支持,也不是完整硬件诊断 |
--abort |
一个 stressor 发生失败时终止其余测试 | 不是温度或容量保护机制 |
--metrics / --metrics-brief |
输出汇总指标 / 简版指标 | 指标需要按 stressor 解释 |
--log-file FILE |
保存工具日志 | 不包含外部监控,文件名应避免重复 |
--yaml FILE |
输出 YAML 统计 | 不能替代退出码与完整日志 |
--seed 42 |
固定伪随机初始种子 | 不能固定线程调度、物理页分配与系统背景噪声 |
--dry-run |
解析参数但不运行压力 | 不能验证实际资源是否足够或硬件是否支持 |
--sequential N --with LIST |
对指定 stressor 逐项运行 N 个实例 | --timeout 对每一项生效,不是总时长 |
--class 'memory?' |
查询某类 stressor | 引号避免 shell 将 ? 当通配符;仅列出清单 |
--taskset LIST |
限定运行 CPU 集合 | 按平台支持和可用 CPU 集合确认;不宜机械指定 CPU 0 |
3.3 特别注意容量语义与版本差异
V0.22.01 的 --vm-bytes 是总量,分摊给 vm workers。 官方 man page 写明 “mmap N bytes in total”,源码实际采用 vm_total / args->instances,另有最小值和页对齐处理:
stress-ng --vm 2 --vm-bytes 256M --timeout 30s
在该版本中,每个 vm worker 的目标映射约为 128M,不是每个 256M。历史版本/旧教程可能采用“每 worker”描述;不能跨版本套用。首次实验统一用 --vm 1 和绝对容量,以规避歧义。
内存映射量不等于 RSS:实际驻留量、附加进程开销、页表、缓存、swap 和内存回收均会影响观测。--vm-bytes 80% 这类写法并不是“最多使用容器内存上限的 80%”的可靠保证,应优先使用根据宿主机与 cgroup 余量计算的绝对值。
--hdd-bytes 按 hdd worker 计算。 --hdd 2 --hdd-bytes 128M 需为约 256M 的文件数据以及元数据等额外开销预留空间。它会循环写读,累计写入可远大于 256M。
4. 安全准备与停止方法
4.1 开始前检查
- 使用独立测试机、可回滚 VM 或专用测试容器;避免在生产主机和正在进行重要工作的桌面上运行。
- 保存工作,确认有备份、空闲磁盘空间、健康散热和稳定供电。
- 初次使用普通用户,显式指定 1 个 worker、10–30 秒、小容量,先
--dry-run。 - 为内存实验预留操作系统、业务与监控所需余量;不要仅依据总物理内存决定容量。
- 为磁盘实验选择独立目录/测试卷;
/tmp在某些 Linux 上是 tmpfs,实际产生的是内存压力。 - 在另一终端开启监控。远程实验保留第二个 SSH 会话,必要时准备带外管理。
- 确定停止条件:出现业务超时、持续 swap、温度接近厂商限制、明显降频、内核错误、容量不足时立即停止。
不要设置一个适用于所有硬件的固定温度阈值,应参考 CPU/设备规格和现场基线。
4.2 初学阶段避免的选项和测试
不要直接使用 --all 0、不加筛选的 --sequential 0、--maximize、--aggressive、--thrash,也不要启动无资源上限的 bigheap、大量 fork 或其他可能耗尽资源的组合。
特别注意:io stressor 会反复调用 sync(),可能影响共享系统上的其他文件写回;iomix 是多种 I/O 活动组合,也不是低风险的磁盘带宽测试。初次存储实验优先使用有明确目录和容量的 hdd。
官方提醒:root 运行会涉及 Linux OOM 分数调整,使低内存时的行为更具侵扰性。--no-oom-adjust 可禁用其 OOM 分数调整,但不构成隔离;--oom-avoid 也只是尽力避免 OOM,不能代替资源预算和 cgroup 限制。
4.3 停止实验
- 前台运行时先按
Ctrl+C。工具收到 SIGINT 会尝试终止 worker 并清理临时文件和共享内存。 - 必要时定位自己启动的父进程,发送 SIGINT:
pgrep -a stress-ng
kill -INT "${STRESS_NG_PID:?请先设置本次实验的父进程 PID}"
先将变量 STRESS_NG_PID 设置为确认过的本次实验父进程 PID,再执行 kill;未设置时上面的命令会拒绝执行。pgrep -a 示例适用于 Linux,macOS 可用 pgrep -fl stress-ng 查看。
- 不要一开始就
kill -9或批量杀掉其他人的实验。强杀可能留下临时文件,丢失汇总结果。 - 如果进程处于不可中断 I/O 等待,超时和信号都可能不能立即生效。
--timeout不是硬性运行时上限。
5. 实验前基线与监控
5.1 Linux 基线
date -Is
stress-ng --version
uname -a
lscpu
free -h
swapon --show
df -h . /tmp
ulimit -a
额外记录:内核/BIOS 版本、电源模式、CPU governor、NUMA 拓扑、文件系统/挂载参数、容器配额、其他业务负载。cgroup v2 下检查目标 cgroup 的 cpu.max、memory.max、memory.current、memory.events;路径随部署而变,不要默认根 cgroup 就是目标。
5.2 Linux 监控:另开终端
vmstat 1
iostat -xz 1
mpstat -P ALL 1
watch -n 1 sensors
这些是独立监控方式,按实验选择,不需要全部同时开启。iostat、mpstat 来自 sysstat;sensors 取决于传感器与配置;第一条 vmstat 和默认 iostat 首份报告常含自启动以来统计,应主要关注后续采样。
| 观察项 | 重点 |
|---|---|
| CPU | 每核利用率、运行队列、频率、热降频;不要只看总 CPU 百分比 |
| 内存 | available、RSS、swap in/out、major fault、PSI 与 OOM 事件 |
| 存储 | 读写吞吐、await、队列深度、空间余量;NVMe 上 %util 不等于简单饱和判据 |
| 调度 | context switches、run queue、真实业务延迟 |
| 系统日志 | OOM、I/O error、hung task、MCE/EDAC;读取可能需要权限 |
| 应用 | p50/p95/p99 延迟、错误率、连接失败;需另行收集 |
Linux 上可按权限查看 dmesg 或 journalctl -k。若环境支持,/proc/pressure/cpu、/proc/pressure/memory、/proc/pressure/io 可反映资源等待压力。
5.3 macOS 基线与监控
sw_vers
uname -m
sysctl hw.logicalcpu hw.physicalcpu hw.memsize
vm_stat
df -h .
使用“活动监视器”观察 CPU、内存压力、swap 和磁盘;需要命令行时可分别使用 top、vm_stat 1、iostat 1。macOS 的工具输出与 Linux 不同,不能照搬 Linux 字段解释。温度/功耗采集需另选支持当前 macOS 和芯片的工具,不假设 sensors 或 /sys/class/thermal 可用。
6. 分级实验清单
下面所有命令均为待执行示例,不是已测结果。默认使用普通用户。 除标注 Linux 的项目外,也须先确认当前平台支持。先低负载、单变量,再逐级提高;不要一次复制运行整个章节。
E0:最小冒烟测试
先检查参数,再只启动一个半负载 CPU worker:
stress-ng --cpu 1 --cpu-method sqrt --cpu-load 50 --timeout 10s --verify --metrics-brief --dry-run
stress-ng --cpu 1 --cpu-method sqrt --cpu-load 50 --timeout 10s --verify --metrics-brief
观察:程序能启动、输出指标、无校验错误、按预期结束、机器仍可交互。单 worker 50% 负载不等于整机 50% 利用率。
E1:CPU 忙闲比例对比
stress-ng --cpu 1 --cpu-method sqrt --cpu-load 25 --timeout 30s --verify --metrics-brief
stress-ng --cpu 1 --cpu-method sqrt --cpu-load 50 --timeout 30s --verify --metrics-brief
stress-ng --cpu 1 --cpu-method sqrt --cpu-load 100 --timeout 30s --verify --metrics-brief
每次测试之间等待温度与后台活动恢复基线;上面的三条不建议无间隔批量执行。
观察:每核利用率、频率与温度。--cpu-load 是忙/睡比例目标,调度与频率变化会使实际值不同;bogo ops 也不保证与设定负载线性变化。
E2:CPU worker 数量对比
stress-ng --cpu 1 --cpu-method sqrt --timeout 30s --verify --metrics-brief
stress-ng --cpu 2 --cpu-method sqrt --timeout 30s --verify --metrics-brief
确认资源足够后再加到 4,不要默认满核。记录吞吐、单实例 CPU 使用率、温度、频率与业务延迟。增加 worker 后收益变小,可能来自配额、SMT、缓存、热限制或调度,并非一定是 CPU 故障。
Linux 需要绑核时,先检查当前允许集合:
taskset -pc $$
再选择该集合内的 CPU 编号配置 --taskset。不要假设容器允许 CPU 0,也不要把 worker 数与 CPU 亲和性混为一谈。
E3:另一种计算模型——矩阵
stress-ng --matrix 1 --matrix-size 64 --timeout 30s --verify --metrics-brief
观察计算与缓存行为差异。--cpu-load 50 不会限速此测试;需要限制资源时使用系统配额,而非 CPU stressor 专用参数。矩阵结果不能与 cpu sqrt 的 bogo ops 直接比较。
E4:内存保留映射与反复映射
有足够余量时,先运行保留映射版本:
stress-ng --vm 1 --vm-bytes 128M --vm-method write64 --vm-keep --timeout 30s --verify --metrics-brief
再比较不保留映射的版本:
stress-ng --vm 1 --vm-bytes 128M --vm-method write64 --timeout 30s --verify --metrics-brief
观察 RSS、page faults、system CPU、swap 和内存压力。write64 固定写模式;默认 all 会遍历方法。先比较相同容量与单 worker,再根据 available 和 cgroup 余量决定是否升到 256M / 512M。
停止条件:明显交互卡顿、持续 swap 或 OOM;不要为了“看满内存”盲目提高容量。
E5:缓存压力——进阶
stress-ng --cache 1 --timeout 15s --metrics-brief
先查当前版本缓存参数、默认分配量和平台支持。此类测试可能同时带来内存与带宽压力,不是纯 CPU 算术,也不是精确缓存带宽测量;资源紧张环境可跳过。
E6:文件系统顺序与随机读写
先在确认有空间的测试卷上创建目录。下面使用 $HOME,如需测试其他设备,请改为对应专用目录:
export LAB_DISK_DIR="$HOME/stress-ng-lab-files"
mkdir -p "$LAB_DISK_DIR"
df -h "$LAB_DISK_DIR"
顺序读写:
stress-ng --hdd 1 --hdd-bytes 128M --hdd-opts wr-seq,rd-seq --temp-path "$LAB_DISK_DIR" --timeout 30s --metrics-brief
随机读写:
stress-ng --hdd 1 --hdd-bytes 128M --hdd-opts wr-rnd,rd-rnd --temp-path "$LAB_DISK_DIR" --timeout 30s --metrics-brief
观察吞吐、延迟、队列、缓存与 system CPU。小文件可能主要命中页缓存,不能据此得出磁盘物理带宽。此测试反复写入,SSD 累计写入和寿命风险与持续时间相关。
E7:同步写入——进阶存储实验
stress-ng --hdd 1 --hdd-bytes 64M --hdd-opts wr-seq,fsync --temp-path "$LAB_DISK_DIR" --timeout 15s --metrics-brief
沿用 E6 的目录变量。fsync 增加每次写入后的显式同步,适合观察写回路径和延迟,不是数据库事务持久性的完整模拟。它可能干扰同设备的其他业务,需在独立测试卷上进行。
需要减少页缓存影响时,可研究 direct;其支持受平台、文件系统、对齐要求影响。direct 不等于保证持久化,上游说明若需同步 I/O 还应考虑 sync。不要通过全局 drop caches 给共享机器制造额外扰动。
E8:IPC 与调度
stress-ng --pipe 1 --timeout 30s --metrics-brief
stress-ng --switch 1 --timeout 30s --metrics-brief
分别运行,观察 context switches、system CPU 和调度等待。此类模型不应只用 CPU 占用衡量有效压力,亦不能直接推导真实应用的上下文切换成本。
E9:本机 socket
stress-ng --sock 1 --sock-domain ipv4 --sock-port 19000 --timeout 30s --metrics-brief
先确认端口未被占用。该 stressor 在本机执行连接、发送、接收与断开;适合观察 socket 与内核协议栈压力,不证明外部 NIC、交换机或远端服务能力。增加到 N 个 worker 会使用从指定端口开始的一段端口。
容器网络隔离和资源限制会影响结果;macOS 与 Linux 的 socket 行为可能不同。
E10:小规模混合负载
只有 E1、E4、E6 单项测试正常后再执行:
stress-ng --cpu 1 --cpu-method sqrt --cpu-load 50 --vm 1 --vm-bytes 128M --vm-keep --hdd 1 --hdd-bytes 64M --temp-path "$LAB_DISK_DIR" --timeout 30s --verify --abort --metrics-brief
这里三个 stressor 并发运行。观察业务延迟、CPU/内存/存储互相影响;--verify 仅对支持校验的部分生效。混合结果若异常,应退回单项模型定位,而非直接加大压力。
E11:有限清单的顺序测试
stress-ng --sequential 1 --with cpu,vm --cpu-method sqrt --vm-bytes 128M --timeout 15s --verify --metrics-brief
两个 stressor 逐项运行,目标负载时间约 2 × 15s,还需加上启动和清理时间。类查询可用于选型:
stress-ng --class 'memory?'
stress-ng --class 'filesystem?'
不要看到类别清单后立即运行该类别全部测试。不同测试可能创建大量进程、文件或消耗大块内存,应先逐项审查,再用 --with 构造白名单。
建议执行顺序
| 阶段 | 选择 | 升级前条件 |
|---|---|---|
| 初次使用 | E0 → E1 → E2 | 可正常停止、无错误、监控完整 |
| 内存方向 | E4,再考虑 E5 | 有明确内存预算,无持续 swap |
| 存储方向 | E6,再考虑 E7 | 测试卷独立,空间充足,无业务干扰 |
| 系统接口 | E8 → E9 | 清楚进程/端口限制,平台支持 |
| 综合稳定性 | E10 / E11 | 单项已验证,具备恢复与日志方案 |
| 延长运行 | 30s → 2m → 10m,按需更长 | 每一级恢复基线,无热/资源异常 |
7. 如何阅读结果
7.1 指标含义
| 常见列 | 含义 | 容易误解的点 |
|---|---|---|
bogo ops |
stressor 定义的工作迭代计数 | 每种测试计数单位不同 |
real time |
同类 worker 的平均墙钟运行时长 | 不是所有 worker 时长相加 |
usr time |
同类 worker 累计用户态 CPU 时间 | 多核并发时可大于墙钟时间 |
sys time |
同类 worker 累计内核态 CPU 时间 | 高值可能符合 syscall / I/O 模型,并非一定异常 |
bogo ops/s (real time) |
总迭代数 / 墙钟时长 | 可观察同一配置趋势,不是标准吞吐单位 |
bogo ops/s (usr+sys time) |
总迭代数 / 累计 CPU 时间 | 与 wall-time 指标分母不同 |
CPU used per instance |
平均每实例 CPU 使用率 | 有多线程/子进程的测试可能超过 100%;简版可能省略 |
RSS Max |
驻留内存相关的最大值统计 | 不能代替整机或 cgroup 内存峰值 |
某些 stressor 会额外报告具有明确单位的专用指标,仍需查该测试定义。比较时固定版本、method、worker 数、容量、配额、时长和电源状态。
7.2 状态与退出码
V0.22.01 官方 man page 给出的退出码:
| 退出码 | 含义 | 排查方向 |
|---|---|---|
0 |
成功 | 仍需检查是否跳过目标测试、是否达到预期负载 |
1 |
参数错误或 harness 致命资源问题 | 命令、权限、内存等 |
2 |
一个或多个 stressor 失败 | 保存 fail 日志,单项复现 |
3 |
因资源或接口不足而初始化失败 | ENOMEM、ENOSPC、缺失/未实现 syscall 等 |
4 |
架构或操作系统未实现某些 stressor | 查看平台支持,不等于硬件损坏 |
5 |
stressor 被非预期信号杀死 | OOM、外部终止、异常信号 |
6 |
stressor 非预期退出,未收集到时间指标 | 日志与平台异常 |
7 |
bogo ops 指标可能不可信 | 中断计数更新、OOM 或计数状态异常 |
解释退出码时同时看完整日志、shell/容器退出状态和系统事件;外层运行器可能改变最终状态值。不要将“成功退出”理解为“所有目标测试都完整通过”或“硬件认证通过”。
7.3 简单验收标准
对初次小规模实验,可将以下作为操作性验收标准:目标 stressor 实际运行、退出状态符合预期、没有校验 fail 或内核错误、无意外 OOM、温度可控、资源峰值在预算内,停止后进程与测试资源正常回收。
这些标准只说明本次模型和时段内未见异常,不提供长期可靠性或性能 SLA 保证。
8. 可复现实验与日志保存
8.1 保存一次 CPU 实验
下面是 Bash 示例,不要将 ${PIPESTATUS[...]} 与 zsh 的数组规则混用。未使用管道,直接保存 stress-ng 的实际退出码:
run_dir="runs/$(date +%Y%m%d-%H%M%S)-cpu"
mkdir -p "$run_dir"
stress-ng --version > "$run_dir/version.txt" 2>&1
uname -a > "$run_dir/system.txt"
stress-ng --buildinfo > "$run_dir/buildinfo.txt" 2>&1
stress-ng --cpu 1 --cpu-method sqrt --timeout 10s --seed 42 --verify --metrics-brief --dry-run > "$run_dir/dry-run.txt" 2>&1
if [ "$?" -eq 0 ]; then
printf '%s\n' 'stress-ng --cpu 1 --cpu-method sqrt --timeout 10s --seed 42 --verify --metrics-brief' > "$run_dir/command.txt"
if stress-ng --cpu 1 --cpu-method sqrt --timeout 10s --seed 42 --verify --metrics-brief --log-file "$run_dir/stress-ng.log" --yaml "$run_dir/metrics.yaml" > "$run_dir/console.txt" 2>&1; then
result_code=0
else
result_code=$?
fi
printf '%s\n' "$result_code" > "$run_dir/exit-code.txt"
else
printf '%s\n' 'dry-run failed; stress test not started' >&2
fi
该示例会产生真实负载,只有确认安全后才执行。运行目录的秒级命名通常足够手动实验;自动化并发运行时应改用唯一目录,避免覆盖。另行保存监控和应用指标。
同一配置建议重复 3–5 次,预先约定预热和冷却方式,记录中位数及波动;出现异常时保留异常样本,不要只挑最好的结果。固定随机种子不等于完全确定性执行。
8.2 Jobfile:复用测试配方
将下面内容保存为 cpu-smoke.job。这是 stress-ng 配置格式,不是 shell 脚本,也不是 YAML:
run parallel
cpu 1
cpu-method sqrt
cpu-load 50
timeout 10s
seed 42
verify
metrics-brief
stress-ng --job cpu-smoke.job --dry-run
stress-ng --job cpu-smoke.job --log-file cpu-smoke.log --yaml cpu-smoke.yaml
Jobfile 每行写一个选项,去掉开头的 --。正式实验中为输出文件使用唯一名称,并同时保存 jobfile、版本、监控和退出码。它不提供资源隔离。
9. 故障定位速查
| 现象 | 可能原因 | 下一步 |
|---|---|---|
unrecognized option / method 不存在 |
软件包较旧、参数拼写、平台差异 | 查本机 help/man/version,不先盲目升级 |
| stressor skipped / not implemented | syscall、指令集、依赖库或权限不足 | 保存日志、确认编译配置;不默认加 root |
| CPU 占用没有预期高 | worker 数少、CPU 配额、亲和性、cpu-load、I/O 等待 |
查每核、配额和允许 CPU 集合 |
| worker 增加但结果下降 | 缓存/内存带宽争用、配额、热降频 | 退回固定 method 和单项实验,查频率与 PSI |
| 内存实验被杀 | 触及 cgroup 上限或宿主机 OOM | 查 memory.events 与内核日志,缩小绝对容量 |
| VM 实际内存与教程不符 | --vm-bytes 的版本语义、RSS 与映射差异 |
查该版本 man/source 和实际监控 |
| 磁盘结果“异常快” | 小数据命中页缓存、tmpfs、虚拟磁盘 | 确认挂载、设备、缓存和持久化路径 |
ENOSPC / ENOMEM |
空间、inode 或内存耗尽 | 停止后查看目录、df -h / df -i、可用内存 |
| socket 启动失败 | 端口冲突、沙箱/网络策略 | 改用确认空闲的端口,查环境限制 |
| 超时后仍在运行 | 清理、不可中断 syscall、系统严重 thrashing | 查进程状态,先温和停止,勿重复启动更多压力 |
| 温度升高后吞吐下降 | 热降频或功耗限制 | 停止、冷却、确认散热与电源状态 |
--verify fail |
硬件问题、内核/工具 bug 或环境异常 | 保存原始证据,降低压力单项复现,不立即判定硬件损坏 |
10. 实验记录模板
复制本节,每次实验填写一份;不要把未执行命令记成测试结论。
基本信息
| 项目 | 记录 |
|---|---|
| 实验编号 / 时间 / 操作者 | 待填写 |
| 目的与假设 | 待填写,例如“观察固定 CPU 配额下增加 worker 的影响” |
| 主机 / VM / 容器 | 待填写 |
| CPU、逻辑/物理核心、内存 | 待填写 |
| 系统 / 内核 / stress-ng 版本 | 待填写 |
| 编译信息 / 镜像 digest | 待填写 |
| 电源模式、频率策略、初始温度 | 待填写 |
| cgroup / 容器限额与亲和性 | 待填写 |
| 存储设备、文件系统、测试目录 | 待填写 |
| 后台业务与空闲资源基线 | 待填写 |
| 完整命令 / jobfile / 随机种子 | 待填写 |
| 停止条件与恢复方案 | 待填写 |
执行结果
| 项目 | 记录 |
|---|---|
| 目标 stressor 是否实际运行 / 是否跳过 | 待填写 |
| 开始、结束、实际运行时长 | 待填写 |
| 退出码、fail / warn / skip 日志 | 待填写 |
| bogo ops 与该 stressor 的专用指标 | 待填写,注明单位 |
| CPU、频率、温度、功耗峰值 | 待填写 |
| 内存峰值、swap、PSI、OOM | 待填写 |
| I/O 吞吐、延迟、队列、空间变化 | 待填写 |
| 应用吞吐、p95/p99、错误率 | 待填写;未采集则写未采集 |
| 监控和原始日志路径 | 待填写 |
| 重复次数、结果中位数与波动 | 待填写 |
| 停止后的资源清理情况 | 待填写 |
| 结论、局限与下一步 | 待填写,避免从合成负载直接推出业务容量 |
11. 官方资料与后续方向
11.1 本次调查来源
以下内容于 2026-09-30 查询;固定版本链接用于避免 master 后续变化带来的歧义。
- 官方仓库:源码、维护者、问题反馈与版本。
- V0.22.01 Release:本次稳定版本基线;发布日期也通过 GitHub Releases API 核对。
- V0.22.01 README:工具定位、平台、构建依赖、容器入口与安全提醒。
- V0.22.01 官方 man page 源文件:参数、容量语义、指标、退出码和信号清理行为。安装后使用
man stress-ng阅读本机版本。 - V0.22.01 vm stressor 源码:核对
vm_total / args->instances,确认本版本的总量分摊行为。 - Homebrew stress-ng 公式:macOS 安装、版本和 bottle 支持;本次也查询了公式 JSON API。
- Ubuntu Kernel stress-ng 参考页:进一步了解内核测试使用场景;历史例子需要与当前版本核对。
11.2 后续实验方向
- Linux 调度 / cgroup:固定资源配额、CPU 集合,比较同一个 stressor 的不同 worker 数。
- 内存管理:在隔离环境研究 page faults、THP、NUMA 与 PSI,不在共享主机盲目切换全局策略。
- 存储路径:用 stress-ng 产生受控压力,再结合 fio、设备统计与真实应用延迟分析。
- 业务抗压:保持同一业务压测模型,逐项加入 CPU / 内存 / I/O 背景压力,建立资源压力与业务退化的对应关系。
起步建议:安装 → 记录版本 → E0 → E1/E4 → 根据目标选择 E6 或 E8/E9 → 最后做 E10。先确认模型和监控,再扩大负载。
Good Day
Have a good work&life! 2026/08 via LinHong