压力测试
压力测试是在计算机上运行各种工作负载以评估其稳定性的过程。这通常用于可靠地检查超频/降压硬件的稳定性,并监控系统的热行为(例如,最高温度、节流、噪音水平)。有几个程序可用于压力测试系统的各个部分,例如 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 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
当软件加载时,只需对第一个问题回答 “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! ...
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)。
- GPL 版本可在 Arch Linux 安装镜像 上获得。它可以安装
- 对于 EFI 系统,使用 memtest86+-efi,
- 对于 BIOS 系统,使用 memtest86+
- 专有版本不支持 BIOS。将其安装为 memtest86-efiAUR。
- 安装后,其用户可以 更新 GRUB:它将自动检测软件包,并允许用户直接引导到它。
- 版本历史的可靠来源是 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