前言
性能是操作系统至关重要的一部分,openEuler在每个版本迭代的过程中,也十分看重性能的表现。本文将向各位介绍openEuler性能测试中常用的测试套和测试原则,希望可以帮助大家更好地理解性能测试这个重要的领域。
1. 基础性能测试
1.1 stream测试
1.1.1 测试套介绍
Stream主要对内存带宽的实际性能进行测试,支持通过copy、scale、add、triad四种运算方式测试内存带宽的性能。
- Copy先访问一个内存单元,读出值再写入到另一个内存单元。
- Scale读出一个内存单元的值,做一个乘法运算,再将结果写入到另一个内存单元。
- Add操作先从内存单元读出两个值,做加法运算, 再将结果写入到另一个内存单元。
- Triad将三个测试组合起来,先从内存单元中读两个值a、b,对其进行乘加混合运算(a + 因子 * b ) ,将运算结果写入到另一个内存单元。
Stream会直接输出测试报告,结果简洁易读。

结果Add >Trial>Copy>Scale。原因:Add 两个读操作,一个写操作,三次访问内存。Trial虽说也是三次访问内存,但操作复杂,所以带宽比Add略小,copy和scale都是两次访存,但是scale操作复杂,所以带宽比copy略小。
1.1.2 几个重要的编译参数

对于单个CPU,保证测试数组总大小(STREAM_ARRAY_SIZE*sizeof(double))至少是3.8倍的L3 cache size。
1.1.3 常见影响测试套的领域
- 编译器GCC:例如矢量化编译优化。
- 内核:64K页表的内核下开启透明大页可导致性能衰退。
- 硬件:测试机器的内存容量、内存频率、BIOS内存相关的配置会影响测试结果。
1.2 lmbench
1.2.1 测试套介绍
lmbench 是一套简易可移植的,符合ANSI/C 标准为UNIX/POSIX 而制定的微型测评工具。一般来说,它衡量两个关键特征:时延和带宽。
主要功能如下:
- 带宽测评工具:读取缓存文件、拷贝内存、读内存、写内存、管道、TCP。
- 时延测评工具:上下文切换、本地网络(连接的建立、管道、TCP、UDP等)、文件系统的创建和删除、系统调用(进程创建、信号处理等)、内存(L1、L2、main mem、rand mem)等。
还可以用于测试跨node、跨片、跨die时延。
测试结果输出如下:

1.2.2 测试项分类
- 系统调用时延:同类的测试套,如专测系统调用的libmicro测试套。系统调用一般涉及glibc、编译器、以及内核上的改动均可能产生性能影响。
- 上下文切换时延:内核调度方面的影响。
- 本地通信时延:内核网络协议栈方面的影响。
- 文件系统及虚拟内存时延:内核文件系统、虚拟内存影响。
- 本地带宽:内核访存、管道等方面影响。
- 内存时延:不同层级访存影响(L1、L2、主存、随机访存)。
当然除上层内核影响大,底层如BIOS、芯片对上述测试项也常有较大影响,也需关注BIOS版本、BIOS选项上的影响。
1.3 netperf测试
1.3.1 测试套介绍
Netperf是一种网络性能的测量工具(由惠普公司开发的,测试网络栈。即测试不同类型的网络性能的benchmark工具)主要针对基于TCP或UDP的传输测试。Netperf根据应用的不同,可以进行不同模式的网络性能测试,即批量数据传输(bulk data transfer)模式和请求/应答(request/reponse)模式。Netperf测试结果所反映的是一个系统能够以多快的速度向另外一个系统发送数据,以及另外一个系统能够以多快的速度接收数据。
工作原理:



1.3.2 测试项分类
1)STREAM类:
- TCP_STREAM:用来测试进行TCP批量传输TCP数据分组过程时的吞吐量。
- UDP_STREAM:用来测试进行UDP批量传输时的网络吞吐量。
2)RR类:
- TCP_RR:测试对象是多次TCP request和response的交易过程,但是它们发生在同一个TCP连接中,这种模式常常出现在数据库应用中。
- TCP_CRR:与TCP_RR不同,TCP_CRR为每次交易建立一个新的TCP连接。最典型的应用就是HTTP。
- UDP_RR:UDP_RR方式使用UDP分组进行request/response的交易过程。由于没有TCP连接所带来的负担,所以交易率一定会有相应的提升。
netperf由于涉及请求的频繁发送与频繁响应,因此无论是客户端还是服务端,任何一边性能差都对测试结果有显著的影响。
1.4 fio
1.4.1 测试套介绍
fio是一个开源压力测试工具,主要用来测试硬盘IO性能。这个工具的可定制性非常强,可以根据测试者的想法进行各种混合io测试,它支持13种不同类型io引擎(libaio、sync、mmap、posixaio、network等等)。它可以测试块设备或文件,可以通过多线程或进程模拟各种io操作,可以测试统计iops、带宽和时延等性能。
当前我们通常使用异步IO引擎libaio,并结合direct=1,以绕过文件系统缓存来测试硬盘的真实IO性能。
关注的指标为:IOPS和带宽。

1.4.2 重点参数
1.4.3 测试项
测试一般关注顺序读、顺序写、随机读、随机写、混合读写,覆盖小包例如4K,大包例如1024K。
测试的硬盘通常选用NVMe SSD,文件系统采用EXT4/XFS。
关注指标:IOPS和带宽BW。
一般性能问题基本集中在小包,主要受内核在存储IO栈以及文件系统的性能影响。
1.5 iozone3
1.5.1 测试套介绍
iozone是一个文件系统的benchmark工具,可以测试不同的操作系统中文件系统的读写性能,可以通过 write, re-write, read, re-read, random read, random write, 等不同的模式下测试硬盘的性能。 测试的时候请注意,设置的测试文件的大小一定要大过你的内存(最佳为内存的两倍大小),不然linux会给你的读写的内容进行缓存,会使数值非常不准确。
- Write: 测试向一个新文件写入的性能。当一个新文件被写入时,不仅仅是那些文件中的数据需要被存储,还包括那些用于定位数据存储在存储介质的具体位置的额外信息。这些额外信息被称作“元数据”。它包括目录信息,所分配的空间和一些与该文件有关但又并非该文件所含数据的其他数据。因此,Write的性能通常会比Re-write的性能低。
- Re-write: 测试向一个已存在的文件写入的性能。当一个已存在的文件被写入时,所需工作量较少,因为此时元数据已经存在。Re-write的性能通常比Write的性能高。
- Read: 测试读一个已存在的文件的性能。
- Re-Read: 测试读一个最近读过的文件的性能。Re-Read性能会高些,因为操作系统通常会缓存最近读过的文件数据。这个缓存可以被用于读以提高性能。
- Random Read: 测试读一个文件中的随机偏移量的性能。许多因素可能影响这种情况下的系统性能,例如:操作系统缓存的大小,磁盘数量,寻道延迟和其他。
- Random Write: 测试写一个文件中的随机偏移量的性能。同样,许多因素可能影响这种情况下的系统性能,例如:操作系统缓存的大小,磁盘数量,寻道延迟和其他。
1.6 unixbench
1.6.1 测试套介绍
UnixBench是一个类unix系(Unix,BSD,Linux)统下的性能测试工具,一个开源工具,被广泛用于测试linux系统主机的性能。Unixbench的主要测试项目有:系统调用、读写、进程、图形化测试、2D、3D、管道、运算、C库等系统基准性能提供测试数据。
该测试套涉及12个测试子项,可分为以下几类:
- Double-Precision Whetstone:此项用于测试 string handling,因为没有浮点操作,所以深受软件和硬件设计(hardware and software design)、编译和链接(compiler and linker options)、代码优化(code optimazaton)、对内存的cache(cache memory)、等待状态(wait states)、整数数据类型(integer data types)的影响。
- Double-Precision Whetstone:这一项测试浮点数操作的速度和效率。这一测试包括几个模块,每个模块都包括一组用于科学计算的操作。覆盖面很广的一系列 c 函数:sin,cos,sqrt,exp,log 被用于整数和浮点数的数学运算、数组访问、条件分支(conditional branch)和程序调用。此测试同时测试了整数和浮点数算术运算。
- Execl Throughput:测试30秒内可以执行的 execl 系统调用的次数。execl 系统调用是 exec 函数族的一员。它和其他一些与之相似的命令一样是 execve() 函数的前端。
- File copy:测试10秒内从一个文件向另外一个文件传输数据的速率。每次测试使用不同大小的缓冲区。这一针对文件 read、write、copy 操作的测试统计规定时间内的文件 read、write、copy 操作次数。
- Pipe Throughput:测试10秒内一个进程可以向一个管道写 512 字节数据然后再读回的次数。
- Pipe-based Context Switching:测试两个进程10秒内通过一个管道交换一个不断增长的整数的次数。测试打开两个管道,开启两个进程,其中一个进程往管道1写,往管道2读,另一个进程往管道2写,往管道2读,一个进程完成一次读写,计数+1。
- Process Creation:测试30秒内一个进程可以创建子进程然后收回子进程的次数。简单地说,就是不停调用fork函数,创建进程,并立马退出,成功一次计数+1。一般说来,这个测试被用于对操作系统进程创建这一系统调用的不同实现的比较。
- System Call Overhead:测试10秒内反复地连续调用几个系统调用(getpid、getuid、umask等)的次数,测试进入和离开操作系统内核的代价。
- Shell Scripts:测试60秒内一个进程可以并发地开始一个 shell 脚本的 n 个拷贝的次数。首先通过fork函数,创建进程,不停地执行一个脚本(pgms/multi.sh), 执行成功一次+1.其中,shell1表示执行脚本内只有一个子任务执行,shell8表示,执行脚本内会同时起8个子任务并发执行。
1.7 speccpu 2017
1.7.1 测试套介绍
SpecCPU2017是一套CPU子系统测试工具,包括4大种类套件共43个基准测试。4大种类套件如下:
- 整数型:
- SPECrate 2017 Integer,对应用例编号为5xx。
- SPECspeed 2017 Integer,对应用例编号为6xx。
- 浮点型:
- SPECrate 2017 Floating Point,对应用例编号为5xx。
- SPECspeed 2017 Floating Point,对应用例编号为6XX。
SPEC基准广泛用于评估计算机系统的性能。SPEC CPU套件通过测量几个程序(例如编译器GCC,化学程序游戏和天气程序WRF等)的运行时间来测试CPU性能。
Spec2017测试有两种评估方式,分为speed和rate。
- speed是测试完成一项任务需要的时间,即速度测试。
- rate是测试单位时间内可以完成多少任务,即throughput(吞吐量测试)。
- speed和rate测试又分为整数(Integer)和浮点(Floating Point)测试。
1.7.2 测试项分类

一般来说,rate类的测试性能出问题,基本编译器影响最大(通常绑核测试,不涉及调度),而speed类由于是并发测试,涉及调度,因此性能问题一般更多与内核有关系。
常见的透明大页、OpenMP参数调优、CPU幽灵漏洞、大页机制也会影响测试套性能,目前OS上的调优手段相对有限,更多还是依赖编译器的优化能力。
2. 性能测试的基本原则
- 使用同一硬盘进行测试,可挂载同一硬盘作为数据盘或使用系统盘作为数据盘(保证硬盘的参数正常)。如测试项可能受文件系统影响,还需关注测试硬盘的文件系统类型。
- 测试使用同一主机,保持基本硬件一致。
- 测试保证测试工具版本一致。
- 测试需要时需记录GCC、binutils、glibc、kernel、测试工具等版本信息,文件系统类型,硬盘类型,主频,核数、内存、CPU数量与型号、内存主频等硬件配置。
- 测试考虑是否清缓存sync && sysctl -w vm.drop_caches=3。
前言
性能是操作系统至关重要的一部分,openEuler在每个版本迭代的过程中,也十分看重性能的表现。本文将向各位介绍openEuler性能测试中常用的测试套和测试原则,希望可以帮助大家更好地理解性能测试这个重要的领域。
1. 基础性能测试
1.1 stream测试
1.1.1 测试套介绍
Stream主要对内存带宽的实际性能进行测试,支持通过copy、scale、add、triad四种运算方式测试内存带宽的性能。
Stream会直接输出测试报告,结果简洁易读。
结果Add >Trial>Copy>Scale。原因:Add 两个读操作,一个写操作,三次访问内存。Trial虽说也是三次访问内存,但操作复杂,所以带宽比Add略小,copy和scale都是两次访存,但是scale操作复杂,所以带宽比copy略小。
1.1.2 几个重要的编译参数
-DSTREAM_ARRAY_SIZE
stream.c源码中定义了该参数的值建议范围,即大于L3 cache 的4倍。
对于单个CPU,保证测试数组总大小(STREAM_ARRAY_SIZE*sizeof(double))至少是3.8倍的L3 cache size。
-fopenmp
该编译选项启用后,默认开启满核测试,可测试满核的内存带宽。
-DNTIMES
默认值为10。迭代多次,返回剔除第一次结果的最佳结果,可提高该值,增加测试结果的稳定性。
1.1.3 常见影响测试套的领域
1.2 lmbench
1.2.1 测试套介绍
lmbench 是一套简易可移植的,符合ANSI/C 标准为UNIX/POSIX 而制定的微型测评工具。一般来说,它衡量两个关键特征:时延和带宽。
主要功能如下:
还可以用于测试跨node、跨片、跨die时延。
测试结果输出如下:
1.2.2 测试项分类
当然除上层内核影响大,底层如BIOS、芯片对上述测试项也常有较大影响,也需关注BIOS版本、BIOS选项上的影响。
1.3 netperf测试
1.3.1 测试套介绍
Netperf是一种网络性能的测量工具(由惠普公司开发的,测试网络栈。即测试不同类型的网络性能的benchmark工具)主要针对基于TCP或UDP的传输测试。Netperf根据应用的不同,可以进行不同模式的网络性能测试,即批量数据传输(bulk data transfer)模式和请求/应答(request/reponse)模式。Netperf测试结果所反映的是一个系统能够以多快的速度向另外一个系统发送数据,以及另外一个系统能够以多快的速度接收数据。
工作原理:
1.3.2 测试项分类
1)STREAM类:
2)RR类:
netperf由于涉及请求的频繁发送与频繁响应,因此无论是客户端还是服务端,任何一边性能差都对测试结果有显著的影响。
1.4 fio
1.4.1 测试套介绍
fio是一个开源压力测试工具,主要用来测试硬盘IO性能。这个工具的可定制性非常强,可以根据测试者的想法进行各种混合io测试,它支持13种不同类型io引擎(libaio、sync、mmap、posixaio、network等等)。它可以测试块设备或文件,可以通过多线程或进程模拟各种io操作,可以测试统计iops、带宽和时延等性能。
当前我们通常使用异步IO引擎libaio,并结合direct=1,以绕过文件系统缓存来测试硬盘的真实IO性能。
关注的指标为:IOPS和带宽。
1.4.2 重点参数
1.4.3 测试项
测试一般关注顺序读、顺序写、随机读、随机写、混合读写,覆盖小包例如4K,大包例如1024K。
测试的硬盘通常选用NVMe SSD,文件系统采用EXT4/XFS。
关注指标:IOPS和带宽BW。
一般性能问题基本集中在小包,主要受内核在存储IO栈以及文件系统的性能影响。
1.5 iozone3
1.5.1 测试套介绍
iozone是一个文件系统的benchmark工具,可以测试不同的操作系统中文件系统的读写性能,可以通过 write, re-write, read, re-read, random read, random write, 等不同的模式下测试硬盘的性能。 测试的时候请注意,设置的测试文件的大小一定要大过你的内存(最佳为内存的两倍大小),不然linux会给你的读写的内容进行缓存,会使数值非常不准确。
1.6 unixbench
1.6.1 测试套介绍
UnixBench是一个类unix系(Unix,BSD,Linux)统下的性能测试工具,一个开源工具,被广泛用于测试linux系统主机的性能。Unixbench的主要测试项目有:系统调用、读写、进程、图形化测试、2D、3D、管道、运算、C库等系统基准性能提供测试数据。
该测试套涉及12个测试子项,可分为以下几类:
1.7 speccpu 2017
1.7.1 测试套介绍
SpecCPU2017是一套CPU子系统测试工具,包括4大种类套件共43个基准测试。4大种类套件如下:
SPEC基准广泛用于评估计算机系统的性能。SPEC CPU套件通过测量几个程序(例如编译器GCC,化学程序游戏和天气程序WRF等)的运行时间来测试CPU性能。
Spec2017测试有两种评估方式,分为speed和rate。
1.7.2 测试项分类
一般来说,rate类的测试性能出问题,基本编译器影响最大(通常绑核测试,不涉及调度),而speed类由于是并发测试,涉及调度,因此性能问题一般更多与内核有关系。
常见的透明大页、OpenMP参数调优、CPU幽灵漏洞、大页机制也会影响测试套性能,目前OS上的调优手段相对有限,更多还是依赖编译器的优化能力。
2. 性能测试的基本原则