Linux服务器基准测试方案
1.测试目的
测试云服务器的基准性能,包括CPU、内存、磁盘性能。
2.测试环境
2.1 软件配置
表1-1
系统类型 |
系统版本 |
数量(套) |
说明 |
Linux |
CentOS 7.6 |
1 |
购买参数: 通用计算增强型 | c6.large.2 | 2vCPUs | 4GB |
2.1 硬件配置
表1-2
服务器 |
CPU |
内存 |
磁盘 |
网络(基准/最大) |
数量 |
ecs-cts3 |
2 Cores |
4GB |
40G |
1.2/4 Gbit/s |
1 |
3.测试工具
3.1 CPU、内存测试工具sysbench
sysbench是一款开源的多线程性能测试工具,可以执行CPU/内存/线程/IO/数据库等方面的性能测试。
#yum -y install sysbench
sysbench命令的基本参数:
#sysbench --help
表2-1
测试项[testname] |
备注 |
fileio |
文件I/O测试 |
cpu |
cpu性能测试 |
memory |
内存速度测试 |
threads |
线程子系统性能测试 |
mutex |
互斥性能测试 |
选项[options] |
备注 |
--threads=N |
需要使用的线程数,默认为1 |
--events=N |
事件总数限制,默认为0,无限制 |
--time=N |
限制的总执行时间,默认为10s |
--forced-shutdown=STRING |
执行时间结束后等待几秒然后强制关闭,默认为off,禁用 |
--thread-stack-size=SIZE |
每个线程的堆栈大小,默认为64K |
--rate=N |
平均处理速率,默认为0,无限制 |
--report-interval=N |
指定间隔(秒)报告统计信息,默认为0,禁用 |
--report-checkpoints=[LIST,...] |
转存完整统计信息并在指定时间点重置所有计数器。参数是一个逗号分隔的值列表,表示必须执行报表检查点时,从测试开始算起经过的时间(以秒为单位)。默认情况下,报表检查点处于关闭状态。 |
--debug[=on|off] |
输出更多调试信息,默认关闭 |
--validate[=on|off] |
尽可能执行验证检查,默认关闭 |
--help[=on|off] |
输出帮助信息并退出,默认关闭 |
--version[=on|off] |
输出版本信息并退出,默认关闭 |
--config-file=FILENAME |
包含命令行选项的文件 |
命令[command] |
备注 |
prepare |
准备 |
run |
运行 |
cleanup |
清理 |
help |
帮助 |
sysbenh测试工具命令
根据测试需要调整参数
sysbench [testname] [options].. [command]
3.2 磁盘测试工具fio
FIO是测试IOPS的非常好的工具,用来对硬件进行压力测试和验证。
安装fio测试工具
#yum -y install fio
fio命令常用参数: 表3-1
参数 |
说明 |
-direct |
定义是否使用direct IO,可选值如下: |
|
值为0,表示使用buffered IO |
|
值为1,表示使用direct IO |
-iodepth |
定义测试时的IO队列深度,默认为1。 |
|
此处定义的队列深度是指每个线程的队列深度,如果有多个线程测试,意味着每个线程都是此处定义的队列深度。fio总的IO并发数=iodepth * numjobs。 |
-rw |
定义测试时的读写策略,可选值如下: |
|
随机读:randread |
|
随机写:randwrite |
|
顺序读:read |
|
顺序写:write |
|
混合随机读写:randrw0 |
-ioengine |
定义fio如何下发IO请求,通常有同步IO和异步IO: |
|
同步IO一次只能发出一个IO请求,等待内核完成后才返回。这样对于单个线程IO队列深度总是小于1,但是可以透过多个线程并发执行来解决。通常会用16~32个线程同时工作把IO队列深度塞满。 |
|
异步IO则通常使用libaio这样的方式一次提交一批IO 请求,然后等待一批的完成,减少交互的次数,会更有效率。 |
-bs |
定义IO的块大小(block size),单位是k、K、m和M等,默认IO块大小为4 KB。 |
-size |
定义测试IO操作的数据量,若未指定runtime这类参数,fio会将指定大小的数据量全部读/写完成,然后才停止测试。 |
|
该参数的值,可以是带单位的数字,比如size=10G,表示读/写的数据量为10GB;也可是百分数,比如size=20%,表示读/写的数据量占该设备总文件的20%的空间。 |
-numjobs |
定义测试的并发线程数。 |
-runtime |
定义测试时间。 |
|
如果未配置,则持续将size指定的文件大小,以每次bs值为分块大小读/写完。 |
-group_reporting |
定义测试结果显示模式,group_reporting 表示汇总每个进程的统计信息,而非以不同job汇总展示信息。 |
-filename |
定义测试文件(设备)的名称。 |
|
此处选择文件,则代表测试文件系统的性能。例如:-filename=/opt/fiotest/fiotest.txt |
|
此处选择设备名称,则代表测试裸盘的性能。例:-filename=/dev/vdb1 |
|
注意: |
|
如果在已经分区、并创建文件系统,且已写入数据的磁盘上进行性能测试,请注意filename选择指定文件,以避免覆盖文件系统和原有数据。 |
-name |
定义测试任务名称。 |
3.3 网络测试工具iperf
iperf 是一个网络性能测试工具。Iperf可以测试最大TCP和UDP带宽性能,具有多种参数和UDP特性,可以报告带宽、延迟抖动和数据包丢失。
iperf测试需要两台服务器,两个系统,因为一个系统必须充当服务端,另外一个系统充当客户端,客户端连接到需要测试速度的服务端。
安装iperf测试工具
#yum -y install iperf
iperf命令的基本参数:
表3-2
命令行选项 |
描述 |
客户端与服务器共用选项 |
|
-b, --bandwidth [kmgKMG | pps] |
发送的带宽,以bits/sec或pps为单位 |
-e, --enhancedreports |
使用增强的报告提供更多的tcp/udp和流量信息 |
-f, --format [kmgKMG] |
报告采用的单位:Kbits、Mbits、KBytes、Mbytes |
-i, --interval |
带宽报告产生的周期,单位为秒 |
-l, --len [kmKM] |
要读或写的缓冲区长度(字节)(默认值:TCP=128K,v4-UDP=1470,v6-UDP=1450) |
-m, --print_mss |
打印TCP最大段大小(MTU-TCP/IP报头) |
-o, --output <filename> |
将报告或错误消息输出到此指定文件 |
-p, --port |
要侦听/连接到的服务器端口 |
-u, --udp |
使用UDP而不是TCP |
-w, --window [KM] |
TCP窗口大小(套接字缓冲区大小) |
-z, --realtime |
实时调度程序 |
-B, --bind <host>[:<port>][%<dev>] |
监听的主机,IP(包括多播地址)和可选端口和设备 |
-C, --compatibility |
兼容旧版本,不发送额外的msg |
-M, --mss |
设置TCP最大段大小(MTU-40字节) |
-N, --nodelay |
设置TCP无延迟,禁用Nagle算法 |
-S, --tos |
设置套接字的IP(字节)字段 |
服务器端专用选项 |
|
-s, --server |
以服务器模式运行 |
-t, --time |
列出新连接和接收流量的时间(秒)(默认值未设置) |
-B, --bind <ip>[%<dev>] |
绑定到多播地址和可选设备 |
-H, --ssm-host <ip> |
设置ssm源,与-B一起用于(S,G) |
-U, --single_udp |
以单线程udp模式运行 |
-D, --daemon |
作为后台程序运行服务器 |
-V, --ipv6_domain |
通过将域和套接字设置为AF/INET6来启用ipv6接收(可以在IPv4和ipv6上接收) |
客户端专用选项 |
|
-c, --client <host> |
以客户端模式运行,连接到<host> |
-d, --dualtest |
同时进行双向测试 |
-n, --num |
要传输的字节数 |
-r, --tradeoff |
单独进行双向测试 |
-t, --time |
传输时间(秒)(默认为10秒) |
-B, --bind [<ip> | <ip:port>] |
绑定从其到源流量的ip(和可选端口) |
-F, --fileinput <name> |
输入要从文件传输的数据 |
-I, --stdin |
输入从stdin传输的数据 |
-L, --listenport |
要接收双向测试的端口 |
-P, --parallel |
要运行的并行客户端线程数 |
-R, --reverse |
反转测试(客户端接收,服务器发送 |
-T, --ttl |
生存时间,用于多播(默认值1) |
-V, --ipv6_domain |
将域设置为ipv6(通过ipv6发送数据包) |
-X, --peer-detect |
执行服务器版本检测和版本交换 |
-Z, --linux-congestion <algo> |
设置TCP拥塞控制算法(仅限linux) |
其它 |
|
-x, --reportexclude [CDMSV] |
排除C(连接)D(数据)M(多播)S(设置)V(服务器)报告 |
-y, --reportstyle C |
报告以逗号分隔值 |
-h, --help |
打印此消息并退出 |
-v, --version |
打印版本信息并退出 |
iperf测试工具命令
根据测试需要调整参数
iperf [-s|-c host] [options]
4.测试方法
4.1 测试CPU性能
使用命令sysbench cpu [options] run
查看可用[options]参数 sysbench cpu help
表4-1
参数 |
备注 |
--cpu-max-prime=N |
产生质数的上限,默认值为10000 |
4.2 测试内存性能
使用命令sysbench memory [options] run
查看可用[options]参数 sysbench memory help
表4-2
参数 |
备注 |
--memory-block-size=SIZE |
测试内存块大小,默认为1k |
--memory-total-size=SIZE |
要传输的数据的总大小,默认为100G |
--memory-scope=STRING |
内存访问作用域{global,local},默认为global |
--memory-hugetlb[=on|off] |
从HugeTLB池分配内存[on|off],默认为off |
--memory-oper=STRING |
内存操作的类型{read, write, none},默认为write |
--memory-access-mode=STRING |
内存访问模式{seq,rnd},默认为seq |
4.3 磁盘测试
测试随机写IOPS:
#fio -direct=1 -iodepth=64 -rw=randwrite -ioengine=libaio -bs=4k -size=10G -numjobs=1 -runtime=600
-group_reporting -filename=/dev/vdb -name=Rand_Write_IOPS_Test
测试随机读IOPS:
#fio -direct=1 -iodepth=64 -rw=randread -ioengine=libaio -bs=4k -size=10G -numjobs=1 -runtime=600
-group_reporting -filename=/dev/vdb -name=Rand_Read_IOPS_Test
测试写吞吐量:
#fio -direct=1 -iodepth=64 -rw=write -ioengine=libaio -bs=1M -size=10G -numjobs=1 -runtime=600
-group_reporting -filename=/dev/vdb -name=Write_BandWidth_Test
测试读吞吐量:
#fio -direct=1 -iodepth=64 -rw=read -ioengine=libaio -bs=1M -size=10G -numjobs=1 -runtime=600
-group_reporting -filename=/dev/vdb -name=Read_BandWidth_Test
4.4 网络测试
tcp模式下测试带宽
服务端运行iperf -s
客户端运行iperf -c <服务端ip>
udp模式下测试带宽,延时,丢包率
服务端运行iperf -s –u
客户端运行iperf -c <服务端ip> -b 1.2G/4G
5.测试用例
5.1 CPU性能测试
测试用例1:CPU性能测试 |
|
测试目的 |
CPU在单核及多核运行情况下的运算速度 |
前置条件 |
客户端运行正常 |
步骤 |
1、 根据需求测试项,调整测试参数 2、 单线程测试 执行sysbench cpu --cpu-max-prime=20000 --threads=1 --time=60 run //20000素数单线程60秒 3、 多线程测试,根据CPU内核数修改,修改--threads =[1,2,4,8…] sysbench cpu --cpu-max-prime=20000 --threads=2 --time=60 run //20000素数2线程60 4、 记录测试结果 |
参数化变量 |
--threads:根据CPU内核数修改线程数,线程数小于等于内核数 |
获取指标 |
1、CPU speed |
5.2 内存测试
测试用例2:内存测试 |
|
测试目的 |
不同内存大小情况下,连续读写或随机读写测试 |
前置条件 |
客户端运行正常 |
步骤 |
1、 根据需求测试项,调整测试参数 2、 不同模式下执行内存的读写测试,修改--memory-access-mode参数,单线程、多线程都要测试,例如 在内存中传输10G的数据,其中每个block 大小为4k,限制总执行时间为60秒 ① 随机写入模式 单线程执行 sysbench memory --time=60 --threads=1 --memory-block-size=4k --memory-total-size=30G --memory-access -mode=rnd run 多线程执行(线程由CPU内核决定,本案例为两核CPU,最大取值至2即可) sysbench memory --time=60 --threads=2 --memory-block-size=4k --memory-total-size=10G --memory-access-mode=rnd run ② 顺序写入模式 单线程 sysbench memory --time=60 --threads=1 --memory-block-size=4k --memory-total-size=10G --memory-access-mode=seq run 多线程 sysbench memory --time=60 --threads=2 --memory-block-size=4k --memory-total-size=10G --memory-access-mode=seq run ③ 随机读取模式 单线程 sysbench memory --time=60 --threads=1 --memory-block-size=4k --memory-total-size=10G --memory-access-mode=rnd --memory-oper=read run 多线程 sysbench memory --time=60 --threads=2 --memory-block-size=4k --memory-total-size=10G --memory-access-mode=rnd --memory-oper=read run ④ 顺序读取模式 单线程 sysbench memory --time=60 --threads=1 --memory-block-size=4k --memory-total-size=10G --memory-access-mode=seq --memory-oper=read run 多线程 sysbench memory --time=60 --threads=2 --memory-block-size=4k --memory-total-size=10G --memory-access-mode=seq --memory-oper=read run 3、记录测试结果 |
参数化变量 |
--threads:根据CPU内核数修改线程数,线程数小于等于内核数 |
获取指标 |
1、传输速度(MiB/sec) |
5.3 磁盘性能测试
测试用例3:磁盘性能测试 |
|
测试目的 |
磁盘读写性能测试 |
前置条件 |
客户端运行正常 当前数据盘大小50G |
步骤 |
1、 根据需求测试项,调整测试参数 测试随机写IOPS:fio -direct=1 -iodepth=64 -rw=randwrite -ioengine=libaio -bs=4k -size=10G -numjobs=1 -runtime=600 -group_reporting -filename=/dev/vdb -name=rndwr_test 测试随机读IOPS:fio -direct=1 -iodepth=64 -rw=randread -ioengine=libaio -bs=4k -size=10G -numjobs=1 -runtime=600 -group_reporting -filename=/dev/vdb -name=rndrd_test 测试写吞吐量:fio -direct=1 -iodepth=64 -rw=write -ioengine=libaio -bs=1M -size=10G -numjobs=1 -runtime=600 -group_reporting -filename=/dev/vdb -name=seqwr_test 测试读吞吐量:fio -direct=1 -iodepth=64 -rw=read -ioengine=libaio -bs=1M -size=10G -numjobs=1 -runtime=600 -group_reporting -filename=/dev/vdb -name=seqrd_test 2、 记录测试结果 |
参数化变量 |
-bs,调整测试文件块大小 |
获取指标 |
1、 IOPS 2、BW |
5.4 测试带宽
测试用例4:TCP下测试带宽 |
|
测试目的 |
TCP下测试带宽 |
前置条件 |
1、服务器运行正常 2、两个服务器互相通讯正常 |
步骤 |
1、 根据需求测试项,调整测试参数 2、 服务端执行iperf -s -i 1 //作为测试服务端,每1秒发送一次报告 客户端执行iperf -c <服务端IP> -t 60 -i 1 //作为客户端,向服务端传输数据60秒,每秒发送一次报告 3、 记录测试结果 |
获取指标 |
1、 Bandwidth |
测试用例5:UDP下测试带宽,延迟抖动及数据丢包率 |
|
测试目的 |
UDP下测试带宽,延迟抖动及数据丢包率 |
前置条件 |
1、服务器运行正常 2、两个服务器互相通讯正常 |
步骤 |
1、 根据需求测试项,调整测试参数 2、 服务端执行iperf -s -u -i 1 //作为UDP测试服务端,每1秒发送一次报告 客户端执行iperf -c <服务端IP> -u -t 60 -b 1.2G -i 1 //作为UDP测试客户端,设定带宽为当前购买服务器的基准带宽1.2G,向服务端传输数据60秒,每秒发送一次报告 客户端执行iperf -c <服务端IP> -u -t 60 -b 4G -i 1 //作为UDP测试客户端,设定带宽为当前购买服务器的最大带宽4G,向服务端传输数据60秒,每秒发送一次报告 3、 记录测试结果 |
获取指标 |
1、 Bandwidth 2、 Jitter 3、 Datagrams |
6.测试结果
6.1 CPU性能测试
线程数 |
计算最大素数 |
最大执行时间 |
速度(每秒执行事件数) |
1 |
20000 |
60s |
|
2 |
20000 |
60s |
|
6.2 内存性能测试
线程 |
内存访问模式 |
最大执行时间 |
块大小 |
数据大小 |
速度(MiB/sec) |
1 |
随机写入 |
60s |
4k |
10G |
|
顺序写入 |
60s |
4k |
10G |
|
|
随机读取 |
60s |
4k |
10G |
|
|
顺序读取 |
60s |
4k |
10G |
|
|
2 |
随机写入 |
60s |
4k |
10G |
|
顺序写入 |
60s |
4k |
10G |
|
|
随机读取 |
60s |
4k |
10G |
|
|
顺序读取 |
60s |
4k |
10G |
|
6.3 磁盘性能测试
测试项目 |
块大小 |
测试文件大小 |
执行时间 |
IOPS(读写操作速率) |
吞吐(读写速率) |
随机写入 |
4k |
10G |
|
|
|
|
8k |
10G |
|
|
|
|
16k |
10G |
|
|
|
|
32k |
10G |
|
|
|
|
64k |
10G |
|
|
|
|
1M |
10G |
|
|
|
随机读取 |
4k |
10G |
|
|
|
|
8k |
10G |
|
|
|
|
16k |
10G |
|
||
|
32k |
10G |
|
||
|
64k |
10G |
|
||
|
1M |
10G |
|
||
顺序写入 |
4k |
10G |
|
||
|
8k |
10G |
|
|
|
|
16k |
10G |
|
||
|
32k |
10G |
|
||
|
64k |
10G |
|
||
|
1M |
10G |
|
|
|
顺序读取 |
4k |
10G |
|
||
|
8k |
10G |
|
||
|
16k |
10G |
|
|
|
|
32k |
10G |
|
||
|
64k |
10G |
|
||
|
1M |
10G |
|
6.4 网络测试
1)TCP参数记录
测试时长(s) |
传输数据(GB) |
带宽(Gbits/sec) |
|
2) UDP参数记录
测试条件 |
测试时长(s) |
传输数据(GB) |
带宽(Gbits/sec) |
延迟抖动(ms) |
丢包率 |
基准带宽 |
|
|
|||
最大带宽 |
|
|
说明:截图部分省略。
7.测试总结
根据测试数据描述;