一、Benchmark 基础概念
(一)什么是 Benchmark
Benchmark 即基准测试,是一种能相对客观地衡量计算机硬件或软件性能的工具。它可以在相同或不同条件下,对计算机硬件或软件的性能进行比较 。常见的鲁大师和安兔兔等跑分软件都属于 Benchmark 工具。比如我们用鲁大师测试电脑性能,它会给出一个综合得分,通过这个得分能大致了解电脑在硬件性能方面的水平,还能和其他电脑的得分对比,看出电脑性能的高低 。
(二)Benchmark 的评价维度
对于同一硬件或软件,有多个不同维度的评价标准。以压缩算法为例,评价指标包括压缩率(压缩后数据量与原始数据量的比例)、压缩速度(对原始数据进行压缩的耗时)、解压缩时间(对压缩后数据进行恢复的耗时)、压缩资源占用(压缩过程中占用的 CPU 和内存资源),此外还有适用场景(是否适用于文本、图像、视频等不同场景)以及平台兼容性(能否在不同的平台、硬件设备上运行)。在评估硬件性能时,也会根据不同硬件关注不同指标,像 CPU 会关注核心数、频率等,磁盘会关注读写速度、IOPS 等 。
(三)Benchmark 与性能体验的关系
虽然 Benchmark 测试分数高并不一定代表用户体验就更好,但跑分在一定程度上是体验的基础。就像考 95 分的学生不一定比考 92 分的学生更懂课程内容,但通常比考 30 分的学生对知识的掌握更好。例如在电脑游戏体验中,高性能的硬件在 Benchmark 测试中分数高,一般情况下在运行游戏时也会更流畅,不过实际体验还会受到软件优化、游戏服务器等其他因素影响 。
二、CPU 性能评估
(一)CPU 的静态指标
CPU 的静态指标用于衡量其硬件规格和性能参数,能从数据手册中获取。这些指标包括核心数(物理核 / 逻辑核)、基频频率、睿频频率、Cache 大小、制程、典型功率等。比如 Intel Xeon Gold 6226 CPU,它有 12 个物理核、24 个逻辑核,最大睿频频率为 3.70GHz,处理器基础频率是 2.70GHz,Cache 大小为 19.25MB,典型功率 125W。核心数和频率影响 CPU 的运算速度,Cache 大小影响数据读取和存储效率,制程则关系到 CPU 的性能和功耗 。
(二)CPU 的动态指标与测试
SPEC CPU 测试:SPEC(标准性能评估组织)制定的一系列基准测试标准在计算机硬件评测中很重要。其测试场景包含整数计算、压缩解压、浮点计算、加密解密、访存、图像处理、控制流等方面。通过这些测试,可以全面了解 CPU 在不同工作负载下的性能表现 。
其他常用测试:除了 SPEC CPU 测试,针对不同应用场景还有其他测试工具和指标。如 Oracle 和 MySQL 数据库常用 tps/tpm 衡量性能,Nginx 常用于网络性能测试,常用 99% latency 进行性能衡量,SPECJbb 是针对 JAVA 性能的测试工具,且对内存比较敏感 。
自定义 BenchMark:可以通过在不同处理器上安装相同操作系统,用相同编译器编译相同计算任务(如计算 100W 以内的素数)的二进制文件并执行,比较计算时间来粗略评估处理器计算性能。不过要注意,在某一特定计算任务中性能好,不代表该处理器综合性能更优 。
(三)使用开源Phoronix Test Suite进行SPEC CPU 测试
克隆Phoronix Test Suite仓库
cd ~;git clone https://github.com/phoronix-test-suite/phoronix-test-suite.git安装依赖
apt-get install php-cli php-xml unzip安装Phoronix Test Suite
cd phoronix-test-suite;sudo ./install-sh使用以下命令搜索与 CPU 性能测试相关的套件,或者访问官网https://openbenchmarking.org/suites (opens in a new tab)
phoronix-test-suite search cpu选择并安装测试套件,这里使用c-ray(一款用于测试 CPU 渲染性能的测试套件,可一定程度反映 CPU 的计算能力)
phoronix-test-suite install pts/c-rayc-ray测试时间比较,我门运行smallpt测试,根据提示,选择测试项
phoronix-test-suite benchmark smallptWould you like to save these test results (Y/n):
#输入`Y`,回车
Enter a name for the result file:
#输入`cpu-test`,回车
Enter a unique name to describe this test run / configuration:
#输入`for_learning`,回车
New Description:
#使用默认,直接回车
Estimated Time To Completion: 18 Minutes [06:49 UTC]
Started Run 1 @ 06:31:16
#测试开始测试完成后,Phoronix Test Suite 会生成详细的测试报告。你可以选择在终端中查看简要报告,也可以选择生成 HTML 格式的详细报告,方便后续分析和分享。
测试结果的保存目录为/var/lib/phoronix-test-suite/test-results/
Smallpt 1.0:
#使用pts/smallpt - 1.2.1进行测试,这是一款全局光照渲染器测试工具,测试采用 128 样本 。
pts/smallpt-1.2.1 [Global Illumination Renderer; 128 Samples]
#预计进行 3 次测试,预估完成时间为 5 分钟,从 08:59:44 开始依次启动 3 次测试,分别在 08:59:44、09:02:48、09:05:52 启动 。
Test 1 of 1
Estimated Trial Run Count: 3
Estimated Time To Completion: 5 Minutes [09:03 UTC]
Started Run 1 @ 08:59:44
Started Run 2 @ 09:02:48
Started Run 3 @ 09:05:52
#3 次测试的时间分别为 179.971 秒、179.883 秒、180.241 秒 。
Global Illumination Renderer; 128 Samples:
179.971
179.883
180.241
#平均时间为 180.032 秒,偏差为 0.10%,表明 3 次测试结果较为稳定 。
Average: 180.032 Seconds
Deviation: 0.10%
#自 2011 年 2 月 26 日以来,OpenBenchmarking.org上有 6958 个相关样本,其中位数结果为 26.46 秒 。
#本次测试结果处于第 7 个百分位,耗时 180 秒,与其他不同处理器的测试结果相比,如 ARMv7 Cortex - A53(304 秒)、Intel Xeon D - 2123IT(196 秒)等,可看出性能差异 。
Comparison of 6,958 OpenBenchmarking.org samples since 26 February 2011; median result: 26.46 Seconds. Box plot of samples:
[ |------------------------*---------------*--------*--------*--*----*----------------------*------------################!#*#*#*-*]
This Result (7th Percentile): 180 ^
ARMv7 Cortex-A53: 304 ^ Intel Xeon D-2123IT: 196 ^ Intel Celeron J3455: 114 ^ 2 x Intel Xeon Silver 4410Y: 4.587 ^
Intel Celeron 3965U: 203 ^ 2 x Intel Xeon E5-2667 v3: 10.28 ^
Intel Celeron N3350: 231 ^ Intel Core i7-5960X: 16.152 ^
Rockchip ARMv8 Cortex-A53: 256 ^ ARMv8 Neoverse-N1: 22.16 ^
Do you want to view the text results of the testing (Y/n): Y
cpu-test
KVM testing on Ubuntu 24.10 via the Phoronix Test Suite.
Common KVM:
#硬件环境:处理器为 Common KVM(1 核心),主板是 QEMU Standard PC(i440FX + PIIX 1996),芯片组为 Intel 440FX 82441FX PMC,内存为 1 x 2GB RAM QEMU,磁盘为 36GB QEMU HDD,网络设备是 Red Hat Virtio device 。
Processor: Common KVM (1 Core), Motherboard: QEMU Standard PC (i440FX + PIIX 1996) (rel-1.15.0-0-g2dd4b9b3f840-prebuilt.qemu.org BIOS), Chipset: Intel 440FX 82441FX PMC, Memory: 1 x 2 GB RAM QEMU, Disk: 36GB QEMU HDD, Network: Red Hat Virtio device
#操作系统为 Ubuntu 24.10,内核版本是 6.11.0 - 19 - generic(x86_64),编译器为 GCC 14.2.0,文件系统为 ext4,系统层使用 KVM 。
OS: Ubuntu 24.10, Kernel: 6.11.0-19-generic (x86_64), Compiler: GCC 14.2.0, File-System: ext4, System Layer: KVM
Smallpt 1.0
Global Illumination Renderer; 128 Samples
#以图表形式展示测试结果,“Seconds < Lower Is Better” 表示时间越短性能越好,
#“Common KVM. 180.03 |=========” 中,“180.03” 为测试耗时,后面的长条形表示在所有测试结果中的相对位置(越长表示性能相对越好,但由于时间越短越好,所以这里长条形长意味着相对其他样本耗时较长,性能较差) 。
Seconds < Lower Is Better
Common KVM . 180.03 |===============================================================================================phoronix-test-suite result-file-to-html [测试结果文件名]三、内存性能评估
(一)内存基础知识
DDR 内存简介
DDR 含义:DDR 是 Double Data Rate SDRAM 的缩写,即双倍数据率同步动态随机存取存储器。它的独特之处在于能够在时钟周期的上升沿与下降沿各传输一次信号,从而提升数据传输效率 。
历代 DDR 的区别:在计算机硬件发展历程中,内存从 SIMM 时代逐渐演进到 DDR 时代。不同代的 DDR 内存,如 DDR、DDR2、DDR3、DDR4、DDR5,它们的传输速率有着明显差异。DDR 的传输速率范围是 200 - 400MT/s,DDR2 为 400 - 800MT/s,DDR3 达到 800 - 2133MT/s,DDR4 是 1600 - 3200MT/s,DDR5 则为 4800 - 6400MT/s。此外,为了防止插入错误插槽,历代 DDR 的外形也有所不同 。
(二)MLC 工具详解
MLC 概述
功能与用途:MLC(Memory Latency Checker)是 Intel 提供的专门用于评估计算机内存子系统延迟和带宽性能的工具 。通过使用 MLC,我们可以深入了解内存系统在不同工作状态下的性能表现,为系统优化和硬件选型提供重要参考。
支持系统与使用方式:MLC 支持 Windows 和 Linux 系统。在 Linux 系统上,直接执行/mlc命令即可输出基本信息;在 Windows 系统上,直接双击mlc.exe就能运行该工具 。
MLC 下载与安装
下载途径:可以从 Intel 官方网站获取 MLC 工具,官网地址:https://www.intel.com/content/www/us/en/developer/articles/tool/intelr-memory-latency-checker.html (opens in a new tab) 。
安装注意事项:下载完成后,在 Linux 系统中,确保文件具有可执行权限;在 Windows 系统中,直接双击运行即可,无需复杂的安装步骤。
#下载
sudo wget https://downloadmirror.intel.com/834254/mlc_v3.11b.tgzmkdir mlc_v3#解压
sudo tar -xzvf mlc_v3.11b.tgz -C ./mlc_v3#进入目录,查看,可以发现解压出来Linux和Windows版本的文件,我们使用Linux版本
cd mlc_v3;ls -lcd Linux;ls -l如果mlc没有执行权限,则赋予执行权限。如果有权限则跳过:
sudo chmod +x ./mlcMLC 常用测试及结果分析
空闲延迟测试(Measuring idle latencies for sequential access):该测试用于衡量内存系统在不受负载情况下,从内存读取数据所需的时间。例如,测试结果中显示不同 Numa 节点的延迟时间,从数据可以看出,访问本地内存的时延远低于访问远端内存的时延。这对于了解内存架构和数据访问的效率非常重要,在实际应用中,如果应用程序对内存访问延迟较为敏感,就需要关注这个指标 。
#原理
#空闲延迟测试用于衡量内存系统在没有负载的情况下,从内存读取数据所需的时间。它主要关注内存的基础延迟特性,反映了内存系统在理想状态下的响应速度。通常,测试结果会显示不同 NUMA(Non-Uniform Memory Access)节点的延迟时间,访问本地内存的时延会远低于访问远端内存的时延。
./mlc --idle_latency#使用的是 Intel Memory Latency Checker 工具的 3.11b 版本
Intel(R) Memory Latency Checker - v3.11b
#运行工具时使用的参数是--idle_latency,也就是进行空闲延迟测试
Command line parameters: --idle_latency
#测试采用的缓冲区大小为 200MiB
Using buffer size of 200.000MiB
#工具无法对内存预取器进行修改。预取器是一种硬件机制,其作用是提前将数据从内存加载到缓存中,以此提升性能。
#MLC 工具通常需要对预取器进行修改来精准测量内存延迟。这里提示你尝试执行modprobe msr命令,msr(Model-Specific Register)是一种特殊寄存器,能够让操作系统对 CPU 的特定功能进行控制。
#由于无法修改预取器,工具会启用随机访问来进行延迟测量。随机访问和顺序访问有所不同,它可能会对测试结果产生影响。
*** Unable to modify prefetchers (try executing 'modprobe msr')
*** So, enabling random access for latency measurements
#每次迭代耗费 215.9 个基本频率时钟周期,换算成时间约为 93.9 纳秒
Each iteration took 215.9 base frequency clocks ( 93.9 ns)峰值注入内存带宽测试(Measuring Peak Injection Memory Bandwidths):此测试主要测量在内存系统受到极大负载时,系统能够处理的内存读写速度。测试会给出不同读写比例下的带宽数据,如 ALL Reads(全读)、3:1 Reads-Writes(读:写 = 3:1)、2:1 Reads-Writes 等情况下的带宽数值。通过这些数据,可以评估内存系统在不同工作负载下的极限性能表现,对于高性能计算、大数据处理等对内存带宽要求较高的场景具有重要参考价值 。
#原理
#峰值注入内存带宽测试用于测量内存系统在承受最大负载时,能够处理的内存读写速度。
#它会给出不同读写比例下的带宽数据,例如全读(ALL Reads)、读与写比例为 3:1(3:1 Reads - Writes)、读与写比例为 2:1(2:1 Reads - Writes)等情况下的带宽数值。
#这些数据可以帮助我们评估内存系统在不同工作负载下的极限性能表现。
./mlc --peak_injection_bandwidthIntel(R) Memory Latency Checker - v3.11b
Command line parameters: --peak_injection_bandwidth
#测试时,每个线程读取使用的缓冲区大小为 100.000MiB,每个线程写入额外使用 100.000MiB 的缓冲区 。
Using buffer size of 100.000MiB/thread for reads and an additional 100.000MiB/thread for writes
*** Unable to modify prefetchers (try executing 'modprobe msr')
*** So, enabling random access for latency measurements
Measuring Peak Injection Memory Bandwidths for the system
Bandwidths are in MB/sec (1 MB/sec = 1,000,000 Bytes/sec)
Using all the threads from each core if Hyper-threading is enabled
Using traffic with the following read-write ratios
#ALL Reads(全读):带宽为 10223.2MB/sec,这表示在只进行读操作的情况下,内存系统的数据传输速度 。
ALL Reads : 10223.2
#3:1 Reads-Writes(读:写 = 3:1):带宽为 12968.2MB/sec,体现了在读操作占比较大的混合读写场景下的内存带宽 。
3:1 Reads-Writes : 12968.2
#2:1 Reads-Writes(读:写 = 2:1):带宽为 13534.6MB/sec,反映了这种特定读写比例下的内存性能 。
2:1 Reads-Writes : 13534.6
#1:1 Reads-Writes(读:写 = 1:1):带宽为 14486.1MB/sec,展示了读写操作均衡时的内存带宽情况 。
1:1 Reads-Writes : 14486.1
#Stream-triad like(类似流三元组操作):带宽为 14949.8MB/sec,流三元组操作通常涉及特定的内存访问模式,该数据表示在这种模式下的内存带宽 。
Stream-triad like: 14949.8 负载延迟测试(Measuring Loaded Latencies):该测试在读写内存数据前设置延时,以获取在这种情况下的带宽数据。通过分析不同延时下的带宽变化,可以了解内存系统在实际使用中,当遇到一定延迟时的性能表现。例如,在某些实时性要求较高的应用中,即使存在一定延迟,内存系统也需要保持稳定的带宽,这个测试结果就能为评估系统是否满足这类应用需求提供依据 。
#原理
#负载延迟测试在读写内存数据前设置延时,以获取在这种情况下的带宽数据。通过分析不同延时下的带宽变化,我们可以了解内存系统在实际使用中,当遇到一定延迟时的性能表现。
#例如,在某些对实时性要求较高的应用中,即使存在一定延迟,内存系统也需要保持稳定的带宽。
./mlc --loaded_latency -D100 #这里-D100表示设置延迟为 100 纳秒Intel(R) Memory Latency Checker - v3.11b
#表示进行负载延迟测试,-D100指定在读写操作前注入 100 个单位(这里应该是纳秒,结合整体测试数据的时间单位推测)的延迟。
Command line parameters: --loaded_latency -D100
#测试时,每个线程读取和写入分别使用 100.000MiB 的缓冲区 。
Using buffer size of 100.000MiB/thread for reads and an additional 100.000MiB/thread for writes
*** Unable to modify prefetchers (try executing 'modprobe msr')
*** So, enabling random access for latency measurements
Measuring Loaded Latencies for the system
Using all the threads from each core if Hyper-threading is enabled
Using Read-only traffic type
#展示了在不同延迟设置下的内存延迟(Latency)和带宽(Bandwidth)数据:
Inject Latency Bandwidth
Delay (ns) MB/sec
==========================
#当延迟为 0 时,带宽为 1044.8MB/sec
00000 61.26 1044.8
#当延迟为 2 时,带宽为 1058.5MB/sec
00002 60.46 1058.5
...
...
...
09000 60.90 1050.8
#延迟为 20000ns 时,带宽为 1056.2MB/sec
20000 60.60 1056.2MLC 命令行参数
基本参数:-e表示不修改硬件预取器状态;-r用于在预取器无法被 MLC 禁用时,进行随机访问获取延迟;-X表示每个核心仅使用一个线程;-v用于输出详细信息 。
高级参数:-a用于测量所有可用 CPU 的空闲延迟,如果同时指定-X,则每个核心仅使用一个线程;-b用于设置缓冲区大小(单位为 KiB,默认值为 100000);-B用于打印每个线程的吞吐量;-C用于将延迟测量线程绑定到指定
四、磁盘基础认知
(一)磁盘的分类
按照磁盘存储实现技术,磁盘主要分为机械硬盘和固态硬盘:
机械硬盘:通过旋转的磁盘和移动的读写头来存储与检索数据。它的优点是存储容量大、价格相对较低 。不过,机械硬盘容易受到物理冲击和振动影响,寿命有限。比如在日常使用中,剧烈震动可能会损坏机械硬盘,导致数据丢失。
固态硬盘:使用闪存芯片存储数据,相比机械硬盘,具有更快的读写速度、更高的可靠性和耐用性 。但价格相对较高。像现在的笔记本电脑,很多都采用固态硬盘,能让系统和软件的启动速度明显加快。
(二)磁盘接口形式
常用的磁盘接口形式有 SATA 和 NVMe SSD:
SATA 接口:传输速度最大约 600MB/s ,读写延时相对较高。一般常见于普通的台式机和笔记本电脑中。
NVMe 接口:传输速度可达数 GB/s ,读写延时远低于 SATA 接口。在高性能计算机和服务器中应用广泛,能大大提升数据的读写效率。
(三)磁盘评价体系
核心评价指标
静态指标:包括容量、尺寸、接口等,这些指标可以直观地反映磁盘的基本特性 。比如,我们在购买硬盘时,会关注它的容量大小,是 500GB 还是 1TB 等。
IOPS(Input/Output Operations Per Second):即每秒读写次数,是衡量随机读写性能的重要指标 。对于数据库等需要频繁随机读写的应用场景,IOPS 越高,磁盘性能越好。
BW(BandWidth):读写带宽,用于衡量磁盘顺序读写的性能 。在传输大文件时,带宽越大,传输速度就越快。
Latency(读写延时):指发送 I/O 请求和接收响应之间的间隔时间 。读写延时越短,磁盘响应速度越快,用户体验也越好。
(四)FIO 工具详解
FIO 工具概述
FIO(Flexible I/O Tester)是一款用于测试磁盘性能的工具,在 Linux 系统中使用广泛。通过 FIO,我们可以对磁盘进行各种类型的性能测试,全面了解磁盘在不同场景下的表现。
(五)FIO 的安装与使用
安装命令:在 Ubuntu 系统中,可以使用apt install fio -y命令来安装 FIO 工具 。安装完成后,就可以在命令行中使用它进行磁盘性能测试。
(六)FIO 测试类型
1. 顺序读测试(Sequential Read Test)
应用场景举例:在视频网站的服务器上,当用户请求播放高清视频时,服务器需要从磁盘中顺序读取视频文件数据,并传输给用户。假设服务器使用的磁盘设备为/dev/sdb,通过这个顺序读测试,可以模拟视频数据读取过程,评估磁盘能否满足视频流畅播放所需的数据读取速度 。
本次测试创建文件fio-test 模拟测试,你需要根据实际情况替换为你要测试的磁盘设备。如/dev/sdb通常代表系统中的第二块 SCSI 或 SATA 磁盘,
touch fio-testfio --name=seq-read --filename=fio-test --direct=1 --rw=read --bs=1M --size=10G --numjobs=1 --runtime=60 --time_based --group_reporting--name=seq-read:为本次测试任务指定一个名称,这里是seq-read,方便在测试结果中识别和区分不同的测试任务。
--filename=fio-test:指定要进行测试的目标设备或文件。
--direct=1:启用直接 I/O 模式。设置为 1 时,数据将直接在用户空间和磁盘设备之间传输,绕过操作系统的页缓存。这样可以更准确地测试磁盘设备本身的读写性能,避免缓存对测试结果的影响。
--rw=read:指定读写模式为顺序读操作。这意味着 FIO 将按照连续的顺序从指定的设备或文件中读取数据。
--bs=1M:设置块大小为 1MB。块大小表示每次 I/O 操作所读写的数据量大小。较大的块大小(如 1MB)适合模拟顺序读写大文件的场景。
--size=10G:指定测试数据的总量为 10GB。FIO 将在这个数据量范围内进行读写操作。
--numjobs=1:设置并发任务的数量为 1。即只使用一个线程或进程来执行读写操作,模拟单线程顺序读的场景。
--runtime=60:指定测试的运行时间为 60 秒。测试将在达到这个时间后停止。
--time_based:表示测试基于时间进行。结合--runtime参数,测试会持续指定的时间,而不是根据--size指定的数据量完成后停止。
--group_reporting:将所有任务的测试结果汇总输出。如果有多个并发任务,使用该参数可以将它们的结果合并显示,方便查看整体性能。测试结果示例:
seq-read: (groupid=0, jobs=1): err= 0: pid=1234: Mon Mar 18 10:00:00 2025
read: IOPS=900, BW=900.0MiB/s (943.7MB/s)(54000MiB/60000msec)
slat (usec): min=2, max=10, avg= 4.00, stdev= 1.50
clat (usec): min=100, max=200, avg=120.00, stdev= 15.00
lat (usec): min=102, max=210, avg=124.00, stdev= 15.50在这个结果中,IOPS为 900,表示每秒能完成 900 次 I/O 操作;BW为 900.0MiB/s ,即每秒读取数据量为 900MiB,说明该磁盘在顺序读场景下性能较好,能够快速读取数据。
2. 顺序写测试(Sequential Write Test)
应用场景举例:在数据库系统进行全量备份时,会将数据库中的数据按顺序写入到磁盘中。以备份/dev/sdb磁盘上的数据库数据为例,通过此顺序写测试,可检验磁盘在顺序写入时的性能表现,确保备份过程高效进行 。
fio --name=seq-write --filename=fio-test --direct=1 --rw=write --bs=1M --size=10G --numjobs=1 --runtime=60 --time_based --group_reporting#与测试读大部分参数含义相同
--rw=write:指定读写模式为顺序写操作。FIO 将按照连续的顺序向指定的设备或文件中写入数据。测试结果示例:
seq-write: (groupid=0, jobs=1): err= 0: pid=1235: Mon Mar 18 10:10:00 2025
write: IOPS=850, BW=850.0MiB/s (896.6MB/s)(51000MiB/60000msec)
slat (usec): min=3, max=12, avg= 5.00, stdev= 2.00
clat (usec): min=110, max=220, avg=130.00, stdev= 20.00
lat (usec): min=113, max=232, avg=135.00, stdev= 20.50这里IOPS为 850,BW为 850.0MiB/s ,表明磁盘顺序写入性能不错,能满足数据库备份等顺序写场景的需求。
3. 随机读测试(Random Read Test)
应用场景举例:在电商网站的数据库中,当用户查询商品信息时,数据库需要随机读取索引数据来定位商品记录。假设数据库数据存储在/dev/sdb磁盘,通过此随机读测试,可模拟用户查询操作时磁盘的 I/O 性能,评估数据库响应查询请求的速度 。
fio --name=rand-read --filename=fio-test --direct=1 --rw=randread --bs=4k --size=10G --numjobs=4 --runtime=60 --time_based --group_reporting
```bash
#与测试读大部分参数含义相同
--rw=randread:指定读写模式为随机读操作。FIO 会随机选择磁盘上的位置进行数据读取,模拟数据库查询等随机访问数据的场景。
--bs=4k:设置块大小为 4KB。较小的块大小(如 4KB)更符合随机读写操作中每次访问的数据量特点。
--numjobs=4:设置并发任务的数量为 4。使用多个并发任务可以模拟多线程或多进程同时进行随机读操作的场景,更接近实际应用中的负载情况。测试结果示例:
rand-read: (groupid=0, jobs=4): err= 0: pid=1236: Mon Mar 18 10:20:00 2025
read: IOPS=15000, BW=58.6MiB/s (61.4MB/s)(3516MiB/60000msec)
slat (usec): min=1, max=50, avg= 8.00, stdev= 3.00
clat (usec): min=20, max=500, avg=150.00, stdev= 30.00
lat (usec): min=21, max=508, avg=158.00, stdev= 32.00从结果可知,IOPS达到 15000,说明磁盘在随机读场景下能处理大量离散的读请求,BW为 58.6MiB/s ,反映了随机读时的数据传输速率。
4. 随机写测试(Random Write Test)
应用场景举例:在在线支付系统中,每完成一笔交易,系统会随机将交易记录写入数据库,存储在/dev/sdb磁盘上。通过随机写测试,可以模拟这种随机写入操作,评估磁盘在高并发随机写入时的性能,确保交易数据写入的效率和稳定性 。
fio --name=rand-write --filename=fio-test --direct=1 --rw=randwrite --bs=4k --size=10G --numjobs=4 --runtime=60 --time_based --group_reporting#与随机读大部分含义相同
--rw=randwrite:指定读写模式为随机写操作。FIO 会随机选择磁盘上的位置进行数据写入,模拟数据库事务写入等随机写入数据的场景。测试结果示例:
rand-write: (groupid=0, jobs=4): err= 0: pid=1237: Mon Mar 18 10:30:00 2025
write: IOPS=12000, BW=46.9MiB/s (49.2MB/s)(2814MiB/60000msec)
slat (usec): min=2, max=40, avg= 7.00, stdev= 2.50
clat (usec): min=25, max=600, avg=180.00, stdev= 40.00
lat (usec): min=27, max=605, avg=187.00, stdev= 42.00此结果中,IOPS为 12000,BW为 46.9MiB/s ,展示了磁盘在随机写场景下的性能,若IOPS和BW数值较低,可能会导致交易记录写入缓慢。
5. 混合读写测试(Mixed Read/Write Test)
应用场景举例:在一个游戏服务器中,玩家在游戏过程中会产生各种操作,如读取游戏地图数据(读操作)和保存游戏进度(写操作)。假设游戏数据存储在/dev/sdb磁盘,通过混合读写测试,可模拟游戏服务器实际运行时磁盘的负载情况,评估磁盘在混合读写场景下的性能表现 。
fio --name=mix-rw --filename=fio-test --direct=1 --rw=randrw --rwmixread=70 --bs=4k --size=10G --numjobs=4 --runtime=60 --time_based --group_reporting--rw=randrw:指定读写模式为随机混合读写操作。FIO 会同时进行随机读和随机写操作。
--rwmixread=70:设置读操作在混合读写操作中所占的比例为 70%,则写操作所占比例为 30%。你可以根据实际应用场景调整这个比例。测试结果示例:
mix-rw: (groupid=0, jobs=4): err= 0: pid=1238: Mon Mar 18 10:40:00 2025
read: IOPS=10500, BW=41.0MiB/s (43.0MB/s)(2460MiB/60000msec)
slat (usec): min=1, max=45, avg= 7.50, stdev= 2.80
clat (usec): min=22, max=550, avg=160.00, stdev= 35.00
lat (usec): min=23, max=558, avg=167.50, stdev= 37.00
write: IOPS=4500, BW=17.6MiB/s (18.5MB/s)(1056MiB/60000msec)
slat (usec): min=2, max=35, avg= 6.50, stdev= 2.20
clat (usec): min=30, max=700, avg=220.00, stdev= 50.00
lat (usec): min=32, max=705, avg=226.50, stdev= 52.00从结果能看到读和写各自的IOPS和BW数据,综合评估磁盘在混合读写场景下的性能,可判断磁盘能否满足游戏服务器这类混合负载的需求。
6. 延时测试(Latency Test)
应用场景举例:在金融交易系统中,对每一笔交易指令的响应时间要求极高。假设交易数据存储在/dev/vdb磁盘,通过延时测试,模拟交易指令读写操作,可精确测量磁盘 I/O 的延迟时间,确保交易响应的及时性 。
fio --ioengine=libaio --numjobs=1 --runtime=120 --direct=1 --time_based --group_reporting --ramp_time=0 --size=20G --bs=4k --iodepth=1 --filename=fio-test --name=latency-test --rw=randwrite--ioengine=libaio:指定使用libaio作为 I/O 引擎。libaio是 Linux 下的异步 I/O 引擎,能够提供较高的 I/O 性能和并发处理能力,适合用于测试 I/O 延迟。
--ramp_time=0:设置预热时间为 0 秒。预热时间是指在正式开始记录测试结果之前,先进行一段时间的 I/O 操作,使系统达到稳定状态。这里设置为 0 表示不进行预热。
--iodepth=1:设置 I/O 队列深度为 1。队列深度表示在一个线程或进程中可以同时发起的未完成 I/O 请求的最大数量。设置为 1 可以更精确地测量每个 I/O 操作的延迟时间。测试结果示例:
latency-test: (groupid=0, jobs=1): err= 0: pid=1239: Mon Mar 18 10:50:00 2025
write: IOPS=5000, BW=19.5MiB/s (20.5MB/s)(2340MiB/120000msec)
slat (usec): min=1, max=10, avg= 3.00, stdev= 1.00
clat (usec): min=100, max=800, avg=250.00, stdev= 50.00
lat (usec): min=101, max=808, avg=253.00, stdev= 51.00结果中的slat、clat和lat分别表示提交延迟、完成延迟和总延迟,可直观反映磁盘 I/O 操作的延迟情况,若延迟过高,可能导致交易处理不及时。
7. IOPS 测试(IOPS Test)
应用场景举例:在虚拟化环境中,多个虚拟机同时对磁盘进行 I/O 操作,产生大量小 I/O 请求。假设虚拟磁盘为/dev/vdb,通过 IOPS 测试,模拟这种高并发小 I/O 请求场景,评估磁盘在单位时间内处理 I/O 请求的能力 。
fio --ioengine=libaio --numjobs=1 --runtime=120 --direct=1 --time_based --group_reporting --ramp_time=0 --size=20G --bs=4k --iodepth=128 --filename=fio-test --name=iops-test --rw=randwrite#延时测试的命令大部分参数含义相同
--iodepth=128:设置 I/O 队列深度为 128。较高的队列深度可以模拟高并发的小 I/O 请求场景,使磁盘在单位时间内处理更多的 I/O 请求,从而更准确地测试磁盘的 IOPS 性能。测试结果示例:
iops-test: (groupid=0, jobs=1): err= 0: pid=1240: Mon Mar 18 11:00:00 2025
write: IOPS=80000, BW=312.5MiB/s (327.7MB/s)(37500MiB/120000msec)
slat (usec): min=2, max=20, avg= 5.00, stdev= 1.50
clat (usec): min=15, max=200, avg=80.00, stdev= 20.00
lat (usec): min=17, max=205, avg=85.00, stdev= 21.00该结果中IOPS为 80000,直观展示了磁盘在高并发小 I/O 请求下的处理能力,IOPS数值越高,说明磁盘在这种场景下性能越好。