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.测试总结
根据测试数据描述;
 
                     
                    
                 
                    
                
 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号