压力测试

来自 ArchWiki

压力测试是在计算机上运行各种工作负载以评估其稳定性的过程。这通常用于可靠地检查超频/降压硬件的稳定性,并监控系统的热行为(例如,最高温度、节流、噪音水平)。有几个程序可用于压力测试系统的各个部分,例如 CPU、GPU、RAM 和存储,使用不同类型的工作负载。

压力测试任务

下表列出了一些基于测试类型和总体工作负载强度的压力测试软件。重要的是使用混合负载进行压力测试,以验证在多种用例下的稳定性。

警告: 在继续之前,强烈建议用户具备监控系统温度的手段。请参阅 传感器
工作负载 测试硬件1 任务 描述
轻度2
CPU,存储 更新补丁 自定义脚本 刷新 OpenWRT 项目中的数百个内核补丁。请参阅 #更新 OpenWRT 的补丁
CPU,存储 写入磁盘镜像 请参阅 #写入镜像文件
RAM 内存压力测试 请参阅 #MemTest86+
实际3
CPU,RAM,存储 编译 并行编译是压力测试 CPU 的好方法。请参阅 #GCC
CPU,RAM 视频编码 ffmpeg, x264, handbrake-cli 等可用于视频编码。请参阅 #视频编码
CPU,RAM 加密货币挖矿 xmrig - xmrig --stress 将使用不同的加密货币挖矿算法(基于 CPU 型号)来生成尽可能高的负载。是测试稳定性和温度的好方法。
GPU 3D 渲染 unigine-heavenAUR 是一个循环运行的 GPU 基准测试。它是 GPU 的一个不错的压力测试。请参阅 基准评测#图形
合成4 CPU,RAM,存储 合成压力测试 stress 是一个用 C 语言实现的简单 CPU、内存、I/O 和磁盘工作负载生成器。请参阅 #stress
CPU,RAM 质数计算 mprimeAUR 分解大数,是压力测试 CPU 和内存的绝佳方法。请参阅 #MPrime
CPU 代数计算 linpackAUR - Linpack 使用 BLAS(基本线性代数子程序)库来执行基本向量和矩阵运算,是压力测试 CPU 稳定性的绝佳方法。请参阅 #Linpack
CPU 圆周率小数计算 systesterAUR Systester 是一款多线程软件,能够计算出高达 128,000,000 位小数的圆周率值。它内置了系统稳定性检查。请参阅 #Systester
RAM 内存压力测试 stressapptestAUR 是一个内存接口测试。
CPU 各种 strainAUR 一个多功能压力测试实用程序。用 Rust 编写。
  • 1 测试的主要目标,实际上所有测试都将在一定程度上涉及 CPU 和 RAM。
  • 2 轻度测试不会对组件施加很大的压力(在功率/热量限制方面)。这些测试仍然有助于测试硬件在较低功率水平(P 状态)下的行为,特别是对于降压系统。
  • 3 实际测试基于真实世界的工作负载。
  • 4 合成测试是专门设计用于尽可能折磨硬件的,可能不能代表真实世界的工作负载。
提示: 为了确保系统的稳定性,建议在不同的温度条件下,长时间运行此类测试,从几个小时到几天不等。例如,如果冬季和夏季之间的室温变化很大,则应考虑这一点。

更新 OpenWRT 的补丁

低负载工作负载的一个好的稳定性测试是运行更新 OpenWRT 项目中的补丁集。按照以下步骤操作。

注意: 需要几个依赖项,包括 git 和 curl,大多数其他依赖项应由 base-devel 元软件包 的依赖项提供。为了安全起见,用户始终可以安装元软件包 openwrt-develAUR
git clone --depth 1 https://github.com/openwrt/openwrt.git
cd openwrt
mkdir -p staging_dir/host/bin
cp /usr/bin/sed ./staging_dir/host/bin
curl -Os https://raw.githubusercontent.com/KanjiMonster/maintainer-tools/master/update_kernel.sh
chmod +x update_kernel.sh
./update_kernel.sh -v -u 6.6

stress

stress 执行一个循环,计算随机数的平方根以压力测试 CPU。它可以同时运行多个工作进程,例如加载 CPU 的所有核心。它还可以根据传递的参数生成内存、I/O 或磁盘工作负载。FAQ 提供了示例和说明。

要生成 4 个工作进程来计算平方根,请使用命令

$ stress --cpu 4

s-tui

s-tui 是一款基于终端的 CPU 压力和监控实用程序。它可以监控 CPU 使用率和温度,也可以压力测试 CPU。它是一个一站式工具,您可以在一个屏幕上看到所有需要的信息,并具有终端图形界面。

MPrime

MPrime(在 Windows 和 MacOS 实现中也称为 Prime95)被普遍认为是衡量系统稳定性的事实标准之一。在酷刑测试模式下,MPrime 将执行一系列 CPU 密集型计算,并将获得的值与已知的良好值进行比较。

Linux 实现称为 mprimeAUR

要运行 mprime,只需打开 shell 并键入 “mprime”

$ mprime
注意: 如果使用 CPU 频率调节,有时用户需要手动将处理器设置为以其最高倍频运行,因为 mprime 使用的 nice 值并不总是触发倍频提升。

当软件加载时,只需对第一个问题回答 “N” 即可开始酷刑测试

Main Menu

1.  Test/Primenet
2.  Test/Worker threads
3.  Test/Status
4.  Test/Continue
5.  Test/Exit
6.  Advanced/Test
7.  Advanced/Time
8.  Advanced/P-1
9.  Advanced/ECM
10.  Advanced/Manual Communication
11.  Advanced/Unreserve Exponent
12.  Advanced/Quit Gimps
13.  Options/CPU
14.  Options/Preferences
15.  Options/Torture Test
16.  Options/Benchmark
17.  Help/About
18.  Help/About PrimeNet Server

酷刑测试有几个选项(菜单选项 15)。

  • 小型 FFT(选项 1)用于压力测试 CPU
  • 原地大型 FFT(选项 2)用于测试 CPU 和内存控制器
  • 混合(选项 3)是默认选项,构成一种混合模式,可压力测试 CPU 和 RAM。

如果发生错误,将报告到 stdout 和 ~/results.txt 以供稍后查看。许多人认为,除非系统可以运行大型 FFT 24 小时,否则不能将其视为 “稳定”。

~/results.txt 示例;请注意,6 月 26 日的两次运行表明硬件故障。在本例中,是由于 CPU 的 vcore 不足

[Sun Jun 26 20:10:35 2011]
FATAL ERROR: Rounding was 0.5, expected less than 0.4
Hardware failure detected, consult stress.txt file.
FATAL ERROR: Rounding was 0.5, expected less than 0.4
Hardware failure detected, consult stress.txt file.
[Sat Aug 20 10:50:45 2011]
Self-test 480K passed!
Self-test 480K passed!
[Sat Aug 20 11:06:02 2011]
Self-test 128K passed!
Self-test 128K passed!
[Sat Aug 20 11:22:10 2011]
Self-test 560K passed!
Self-test 560K passed!
...
注意: 怀疑内存或内存控制器不良的用户应首先尝试混合测试,因为小型 FFT 测试使用的内存非常少。

Linpack

linpackAUR 使用 BLAS(基本线性代数子程序)库来执行基本向量和矩阵运算。它是压力测试 CPU 稳定性的绝佳方法(仅支持 Intel CPU)。安装后,用户应将 /usr/share/linpack/linpack.conf 复制到 ~/.config/linpack.conf 并根据系统上的内存量进行调整。

Systester

SystesterAUR (在 Windows 中也称为 SuperPi)提供 CLI 和 GUI 版本。它通过计算多达 1.28 亿位圆周率数字并包含错误检查来测试系统稳定性。请注意,可以从两种不同的计算算法中选择:Borwein 二次收敛算法和 Gauss-Legendre 算法。后者是流行的 Windows 版 SuperPi 使用的相同方法。

给出了使用 8 个线程的 CLI 示例

$ systester-cli -gausslg 64M -threads 8

MemTest86+

使用 MemTest86 (专有)或 Memtest86+ (GPL)来测试您的内存(RAM)。

提示
  • 版本历史的可靠来源是 memtest86.com 中的 MemTest86 历史 部分,特别是 “2002 - 2004” 及后续部分。请注意,版本 5 到 7 的专有 MemTest86 声称同时支持 BIOS 和 UEFI,但它们只是捆绑了旧版本和新版本。
  • 允许测试运行至少 10 个周期而没有错误通常就足够了。

写入镜像文件

在低负载工作负载下,使用 dd 格式化镜像是一个好的稳定性测试。这可以是物理磁盘或循环挂载的镜像。下面的脚本使用挂载的镜像,并逐个循环遍历每个核心。请注意,您应该调整脚本顶部的变量以匹配您的系统。默认情况下,脚本将每个核心仅运行一次命令。通过更改 for 循环,可以轻松自定义为在已知的弱核心上运行,而不是扫描所有核心 0 到 n。以 root 身份运行脚本。

format-test.sh
#!/bin/bash

# define the path to store the image, recommended to be a tmpfs mounted location to avoid read/writes
img=/scratch/image.img

# define the mount point
mnt=/mnt/loop

# size of time arg to pass to truncate, make sure you select something less than the free memory on the system
# see truncate --help for available options
size=40G

# defaults to 1 less than the number of virtual cores, manually redefine if desired
max=$(($(nproc) - 1))

if [[ ! -f $img ]]; then
  truncate -s $size $img
  mkfs.ext4 $img
  [[ -d $mnt ]] || mkdir -p $mnt
  if ! mountpoint -q $mnt; then
    mount -o loop $img $mnt || exit 1
  fi
fi

for i in $(eval echo "{0..$max}"); do
  echo "using core $i of $max"
  taskset -c "$i" time dd if=/dev/zero of=$mnt/zerofill status=progress
done

umount $mnt
rm $img

GCC

使用 GCC(或其他编译器)进行并行编译将在 CPU 和内存上产生重负载。为避免 I/O 瓶颈,请在 SSD 或 tmpfs 中编译。

一个好的例子是编译内核:有关详细说明,请参阅 内核/Arch 构建系统,在 内核/Arch 构建系统#编译 中运行 makepkg -sf MAKEFLAGS="-j$(nproc)"

视频编码

大多数视频编码器都是高度并行的,旨在利用 CPU 的大部分功能。下面的示例将使用 x265 对噪声进行编码,并丢弃结果。这将严重加载 CPU。

ffmpeg -y -f rawvideo -video_size 1920x1080 -pixel_format yuv420p -framerate 60 -i /dev/urandom -c:v libx265 -preset placebo -f matroska /dev/null

发现错误

一些压力测试应用程序(如 #MPrime#Linpack)内置了 一致性检查来发现由于结果不匹配而导致的错误。在内核本身中可以找到一种更通用和简单的方法来衡量硬件不稳定性。要使用它,只需像这样在崩溃时过滤日志

# journalctl -k --grep=mce

多核芯片还可以提供有关哪个物理/逻辑核心给出错误的信息。如果用户正在优化每个核心的设置,这可能很重要。

内核可以在压力测试应用程序运行时抛出这些错误,然后在它结束计算并报告错误之前,从而提供一种非常灵敏的方法来评估稳定性。考虑以下来自 Ryzen 5900X 的信息

mce: [Hardware Error]: Machine check events logged
mce: [Hardware Error]: CPU 21: Machine Check: 0 Bank 5: baa0000000030150
mce: [Hardware Error]: TSC 0 MISC d012000100000000 SYND 4d000002 IPID 500b000000000
mce: [Hardware Error]: PROCESSOR 2:a20f10 TIME 1625265814 SOCKET 0 APIC 4 microcode a201016

该芯片有 12 个物理核心。在本例中,CPU 21 可以追溯到物理核心 10。使用 hwloc 中的 lstopo 打印硬件拓扑。

Core 0 = CPU 0 + CPU 1
Core 1 = CPU 2 + CPU 3
Core 2 = CPU 4 + CPU 5
Core 3 = CPU 6 + CPU 7
Core 4 = CPU 8 + CPU 9
Core 5 = CPU 10 + CPU 11
Core 6 = CPU 12 + CPU 13
Core 7 = CPU 14 + CPU 15
Core 8 = CPU 16 + CPU 17
Core 9 = CPU 18 + CPU 19
Core 10 = CPU 20 + CPU 21
Core 11 = CPU 22 + CPU 23
注意: 编号可能因不同的 CPU 型号和供应商而异,但通常核心和 CPU 都从 0 开始编号,而不是从 1 开始。