文章目录

  • 常见磁盘性能测试
  • 准备
  • 1. 测试工具
  • 2. 测试要求
  • 3. 开始测试
  • 4. 结果分析
  • 1. SATA
  • 2. NVMe
  • 5. 测试脚本
  • sata
  • NVMe


常见磁盘性能测试

准备

为提高性能值,进入BIOS设置如下两项。

1、Power Policy设置成performance
2、关超线程(Advanced—>Hyper-Threading)

2. 测试要求

  1. 如果有Raid卡,可以通过管理工具把硬盘设置为单盘直通模式,每个规格只需测试其中一个盘即可(有时性能不达标,可以换个盘测下,毕竟盘也是有优良率的)。
  2. 编写测试脚本,确定好最优参数(参考5.测试脚本),修改其中的盘符为正确的盘符(否则可能导致写没系统)。
  3. 确定Fio工具版本,一般使用新版本会稳定些,此次测试使用的是3.20版本。
  4. 无其他业务运行。

3. 开始测试

根据测试需求编辑好第5章节的测试脚本,主要检查:

  1. 测试盘:filename参数。
    例如测试环境如下, 那么sata盘的filename就是/dev/sdb;nvme盘就是nvme0n1或者nvme1n1 。
    注意:如果有拔盘插盘操作(安装新的SCSI设备后,可能出现盘符漂移情况),需要再次查看磁盘盘符,并修改脚本,linux系统盘符漂移原理说明。
[root@localhost shell]# lsblk
NAME            MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda               8:0    0 447.1G  0 disk
sdb               8:16   0 447.1G  0 disk
sdc               8:32   0 446.1G  0 disk
├─sdc1            8:33   0   200M  0 part /boot/efi
├─sdc2            8:34   0   976M  0 part /boot
└─sdc3            8:35   0   445G  0 part
  ├─centos-root 253:0    0 405.9G  0 lvm  /
  └─centos-swap 253:1    0  39.1G  0 lvm  [SWAP]
nvme0n1         259:1    0   1.8T  0 disk
nvme1n1         259:0    0   1.8T  0 disk

执行以下脚本开始测试即可,sata盘和nvme盘每一个指标执行时间和脚本中的 runtime参数一致。

#!/bin/bash
bash sata.sh
#sleep 100
bash nvme.sh

4. 结果分析

跑完后,会在对应文件夹生成类似如下日志:

NVMe:

init_seq2.log
localhost_210422_0323.nmon
localhost_210422_0426.nmon
localhost_210422_0529.nmon
localhost_210422_0632.nmon
localhost_210422_1504.nmon
nvme0n14K_randR_1_1.log_clat.log
nvme0n14K_randR_1_1.log_lat.log
nvme0n14K_randR_1_1.log_slat.log
nvme0n14K_randR_latency.log
nvme0n14K_randW_latency.log

sata:

128K_seqR_iops.log_iops.log
128K_seqR_lat.log_clat.log
128K_seqR_lat.log_lat.log
128K_seqR_lat.log_slat.log
128K_seqR.log
128K_seqW_iops.log_iops.log
128K_seqW_lat.log_clat.log
128K_seqW_lat.log_lat.log
128K_seqW_lat.log_slat.log
128K_seqW.log
4K_randR_iops.log_iops.log
4K_randR_lat.log_clat.log
4K_randR_lat.log_lat.log
4K_randR_lat.log_slat.log
4K_randR.log
4K_randW_iops.log_iops.log
4K_randW_lat.log_clat.log
4K_randW_lat.log_lat.log
4K_randW_lat.log_slat.log
4K_randW.log
init_seq2.log
localhost_210421_1202.nmon
localhost_210421_1303.nmon
localhost_210421_1518.nmon
localhost_210421_1619.nmon

其中.nmon文件就是我们要分析的,生成时间对应我们脚本的中的执行顺序。

分别分析完生成的文件列表类似:

atlas_200331_0157.nmon
atlas_200331_0157.nmon.xlsx
atlas_200331_0258.nmon
atlas_200331_0258.nmon.xlsx
atlas_200331_0517.nmon
atlas_200331_0517.nmon.xlsx
atlas_200331_0618.nmon
atlas_200331_0618.nmon.xlsx
nmon analyser v34a.xls

开始分析:

  • 性能-随机读 (稳态iops均值)

使用Nmon-Analyser打开对应文件,找到”DISKXFER“sheet,计算均值;
随机读写注意观察结果的稳定性,要求在均值的0.9~1.1倍范围内的个数的比例要大于93%(随机读)或者85%(随机写)

AVERAGE(B3:B1802)
AVERAGE(B3:B1802)*0.9
AVERAGE(B3:B1802)*1.1
COUNTIFS(B3:B1802,">"&B1992,B3:B1802,"<"&B1993)/1800
  • 性能-随机写 (稳态iops均值)

使用Nmon-Analyser打开对应文件,找到”DISKXFER“sheet,计算均值;
随机读写注意观察结果的稳定性,要求在均值的0.9~1.1倍范围内的个数的比例要大于93%(随机读)或者85%(随机写)

AVERAGE(B3:B1802)
AVERAGE(B3:B1802)*0.9
AVERAGE(B3:B1802)*1.1
COUNTIFS(B3:B1802,">"&B1992,B3:B1802,"<"&B1993)/1800
  • 性能-顺序读带宽(MB,1MB=1024KB)

使用Nmon-Analyser打开对应文件,找到”DISKREAD“sheet,计算均值;

AVERAGE(B2:B1802)。

  • 性能-顺序写带宽(MB,1MB=1024KB)

使用Nmon-Analyser打开对应文件,找到”DISKWRITE“sheet,计算均值;

AVERAGE(B2:B1802)。

  • 性能-随机读时延(ms,1s=1000ms)

此指标只针对NVMe盘,查看nvme0n14K_randR_latency.logclat (usec): min=0, max=3534, avg=72.93, stdev=20.51,其中avg即为实测值。

[root@localhost nvmetestfile]# cat nvme0n14K_randR_latency.log
mytest: (g=0): rw=randread, bs=4K-4K/4K-4K/4K-4K, ioengine=libaio, iodepth=1
fio-2.1.10
Starting 1 thread

mytest: (groupid=0, jobs=1): err= 0: pid=1245: Thu Apr 22 06:32:07 2021
  read : io=187014MB, bw=53195KB/s, iops=13298, runt=3600001msec
    slat (usec): min=1, max=163, avg= 1.62, stdev= 0.56
    clat (usec): min=0, max=3534, avg=72.93, stdev=20.51
     lat (usec): min=47, max=3535, avg=74.62, stdev=20.51
    clat percentiles (usec):

...
  • 性能-随机写时延(ms,1s=1000ms)
    此指标只针对NVMe盘,查看nvme0n14K_randW_latency.logclat (usec): min=0, max=3534, avg=72.93, stdev=20.51,其中avg即为实测值。

1. SATA

SATA 盘一般会测试4个指标:

机型

达标

满分

投标

“硬盘型号”第1次测试结果

“硬盘型号”第2次测试结果

备注

SATA SSD盘性能-读(稳态iops均值)

SATA SSD盘性能-写(稳态iops均值)

SATA SSD盘性能-读带宽(MB,1MB=1024KB)

SATA SSD盘性能-写带宽(MB,1MB=1024KB)

硬盘得分

2. NVMe

NVMe 盘一般会测试6个指标:

机型

达标

满分

投标

“硬盘型号”第1次测试结果

“硬盘型号”第2次测试结果

备注

PCI-E SSD性能-随机读 (稳态iops均值)

PCI-E SSD性能-随机写 (稳态iops均值)

PCI-E SSD性能-顺序读带宽(MB,1MB=1024KB)

PCI-E SSD性能-顺序写带宽(MB,1MB=1024KB)

PCI-E SSD性能-随机读时延(ms,1s=1000ms)

PCI-E SSD性能-随机写时延(ms,1s=1000ms)

硬盘得分

5. 测试脚本

常见测试值:

sata

sata

NVMe

NVMe

numjobs

iodepth

numjobs

iodepth

随机读

1

128

8

64

随机写

8

32

8

64

顺序读

1

128

1

256

顺序写

1

128

1

256

sata

# cat sata.sh

#!/bin/bash

filename=/dev/sda # 待测磁盘,需要根据实际环境修改!
outdir=/home/work/satatestfile # 测试数据输出路径!
pre_runtime=7200
runtime=3600

#Script of precondition:4K IOPS
fio --ioengine=libaio --direct=1 --thread --norandommap --filename=$filename --name=$outdir/init_seq --output=$outdir/init_seq.log --rw=write --bs=128k --numjobs=1 --iodepth=32 --loops=3
fio --ioengine=libaio --direct=1 --thread --norandommap --filename=$filename --name=$outdir/init_rand --output=$outdir/init_rand.log --rw=randwrite --bs=4k --numjobs=1 --iodepth=32 --ramp_time=60 --runtime=$pre_runtime

#4k Random Read
nohup ./nmon -f -s 2 -c 1900 -m $outdir &
fio --ioengine=libaio --randrepeat=0 --norandommap --thread --direct=1 --group_reporting --name=mytest --ramp_time=60 --runtime=$runtime --time_based --numjobs=1 --iodepth=128 --filename=$filename --rw=randread --bs=4k --output=$outdir/4K_randR.log --log_avg_msec=1000 --write_iops_log=$outdir/4K_randR_iops.log --write_lat_log=$outdir/4K_randR_lat.log
#4k Random Write
nohup ./nmon -f -s 2 -c 1900 -m $outdir &
fio --ioengine=libaio --randrepeat=0 --norandommap --thread --direct=1 --group_reporting --name=mytest --ramp_time=60 --runtime=$runtime --time_based --numjobs=8 --iodepth=32 --filename=$filename --rw=randwrite --bs=4k --output=$outdir/4K_randW.log --log_avg_msec=1000 --write_iops_log=$outdir/4K_randW_iops.log --write_lat_log=$outdir/4K_randW_lat.log

#Script of precondition:Bandwidth
fio --ioengine=libaio --direct=1 --thread --norandommap --filename=$filename --name=init_seq2 --output=$outdir/init_seq2.log --rw=write --bs=128k --numjobs=1 --iodepth=64 --loops=3
#128k Seq Read
nohup ./nmon -f -s 2 -c 1900 -m $outdir &
fio --ioengine=libaio --randrepeat=0 --norandommap --thread --direct=1 --group_reporting --name=mytest --ramp_time=60 --runtime=$runtime --time_based --numjobs=1 --iodepth=128 --filename=$filename --rw=read --bs=128k --output=$outdir/128K_seqR.log --log_avg_msec=1000 --write_iops_log=$outdir/128K_seqR_iops.log --write_lat_log=$outdir/128K_seqR_lat.log
#128k Seq Write
nohup ./nmon -f -s 2 -c 1900 -m $outdir &
fio --ioengine=libaio --randrepeat=0 --norandommap --thread --direct=1 --group_reporting --name=mytest --ramp_time=60 --runtime=$runtime --time_based --numjobs=1 --iodepth=128 --filename=$filename --rw=write --bs=128k --output=$outdir/128K_seqW.log --log_avg_msec=1000 --write_iops_log=$outdir/128K_seqW_iops.log --write_lat_log=$outdir/128K_seqW_lat.log

NVMe

cat nvme.sh

#!/bin/bash


filename=/dev/nvme1n1
outdir=/home/work/nvmetestfile
pre_runtime=7200
runtime=3600


#Script of precondition:4K IOPS
fio --ioengine=libaio --direct=1 --thread --norandommap --filename=$filename --name=init_seq --output=$outdirinit_seq.log --rw=write --bs=128k --numjobs=1 --iodepth=64 --loops=3
fio --ioengine=libaio --direct=1 --thread --norandommap --filename=$filename --name=init_rand --output=$outdirinit_rand.log --rw=randwrite --bs=4k --numjobs=8 --iodepth=32 --ramp_time=60 --runtime=$pre_runtime

#4k Random Read
nohup ./nmon -f -s 2 -c 1900 -m $outdir &
fio --ioengine=libaio --randrepeat=0 --norandommap --thread --direct=1 --group_reporting --name=mytest --ramp_time=180 --runtime=$runtime --time_based --numjobs=8 --iodepth=64 --filename=$filename --rw=randread --bs=4k

#4k Random Write
nohup ./nmon -f -s 2 -c 1900 -m $outdir &
fio --ioengine=libaio --randrepeat=0 --norandommap --thread --direct=1 --group_reporting --name=mytest --ramp_time=180 --runtime=$runtime --time_based --numjobs=8 --iodepth=64 --filename=$filename --rw=randwrite --bs=4k

#Script of precondition:latency
#4k Random Read latency
nohup ./nmon -f -s 2 -c 1900 -m $outdir &
taskset -c 20 fio --ioengine=libaio --randrepeat=0 --norandommap --thread --direct=1 --group_reporting --name=mytest --ramp_time=180 --runtime=$runtime --time_based --numjobs=1 --iodepth=1 --filename=$filename --rw=randread --bs=4k --output=$outdir/nvme0n14K_randR_latency.log --log_avg_msec=1000 --write_lat_log=$outdir/nvme0n14K_randR_1_1.log

#4k Random Write latency
nohup ./nmon -f -s 2 -c 1900 -m $outdir &
taskset -c 20 fio --ioengine=libaio --randrepeat=0 --norandommap --thread --direct=1 --group_reporting --name=mytest --ramp_time=180 --runtime=$runtime --time_based --numjobs=1 --iodepth=1 --filename=$filename --rw=randwrite --bs=4k --output=$outdir/nvme0n14K_randW_latency.log --log_avg_msec=1000 --write_lat_log=$outdir/nvme0n14K_randW_1_1.log


#Script of precondition:Bandwidth
fio --ioengine=libaio --direct=1 --thread --norandommap --filename=$filename --name=$outdir/init_seq2 --output=$outdir/init_seq2.log --rw=write --bs=128k --numjobs=1 --iodepth=64 --loops=3

#128k Seq Read
nohup ./nmon -f -s 2 -c 1900 -m $outdir &
fio --ioengine=libaio --randrepeat=0 --norandommap --thread --direct=1 --group_reporting --name=mytest --ramp_time=180 --runtime=$runtime --time_based --numjobs=1 --iodepth=256 --filename=$filename --rw=read --bs=128k

#128k Seq Write
nohup ./nmon -f -s 2 -c 1900 -m $outdir &
fio --ioengine=libaio --randrepeat=0 --norandommap --thread --direct=1 --group_reporting --name=mytest --ramp_time=180 --runtime=$runtime --time_based --numjobs=1 --iodepth=256 --filename=$filename --rw=write --bs=128k