概述
评估一块NVMe SSD在真实业务场景中的吞吐能力、稳定性、可靠性以及QoS,不仅要考虑压测工具、测试环境选型,还要精心设计测试规范,如此才能准确的获取NVMe SSD在日常运营中的性能表现。预处理就是这样一个在测试中具有重要作用的环节,这篇文章将对NVMe SSD的预处理操作及价值作以说明。aa
在NVMe SSD使用初期,空闲资源充足,垃圾回收等操作比较少,因此性能也会处于高位。但是运行时间一长,数据排布会更随机,垃圾回收、block 擦除等操作触发的频率将趋于稳定,整个SSD的性能也将处于长期稳定的状态。通常性能测试要考核的就是SSD日常的性能和稳定性等指标,所以需要先通过预处理让盘达到稳态。
基于NAND的固态存储设备的性能变化趋势(4K随机写)
上图来自《Solid State Storage (SSS) Performance Test Specification (PTS) v2.0.1》,一份国际标准化组织SNIA(Storage Networking Industry Association)在2018年发布的固态存储设备性能测试规范文档(这里主要就是指基于NAND的SSD产品),并且测试规范分别对企业级和消费级的测试方法做了说明。
从这张图可以看出,虽然SSD性能高低和稳定性都不尽相同,但是都是从开始的峰值下降的,在经历FOB(Fresh Out of the Box)和Transition两个阶段之后,性能趋于稳定,既达到我们所说的稳态。
Fresh Out of the Box (FOB): State of SSS prior to being put into service.
Transition Zone: A performance state where the device’s performance is changing as it goes from one state to another (such as from FOB to Steady State).
SNIA这份规范给出了稳态(Steady State)的判断公式。首先是一个稳态测试周期中,性能结果范围(最大值-最小值)不能超过平均值20%;同时,多轮测试结果的最佳线性回归线的最大值和最小值的差不能超过平均值的10%。这里需要解释一下,假设进行了5轮IOPS测试。那么就需要根据下面公式算出slope(y):
s
l
o
p
e
(
y
)
=
∑
(
x
−
x
ˉ
)
(
y
−
y
ˉ
)
∑
(
x
−
x
ˉ
)
2
slope(y)=frac{sum left ( x-bar{x} right )left ( y-bar{y} right )}{sum left ( x-bar{x} right )^2}
slope(y)=∑(x−xˉ)2∑(x−xˉ)(y−yˉ)
其中x表示第x轮测试,y为该轮测试的结果。
当然,SNIA在定了一大堆规范包含完整的测试流程。包括格式化硬盘(清除数据)、对设备进行预处理、运行测试、对结果进行可视化和后续的分析几个步骤。这里我们也参照SNIA的测试操作规范以及其他的一些实践案例对一块3.84TB的PBlaze5 D910 NVMe SSD做一个IOPS的性能测试(为了让整个测试更加连贯,我们将格式化、预处理和测试的操作写成了脚本)。
测试环境:
OS:centos7.4(kernel: 3.10.0-693.el7.x86_64)
CPU:Intel® Core™ i5-8400 CPU @ 2.80GHz
Memory:16GB
Software:fio3.3
NVMe SSD:PBlaze5 D910 NVMe SSD(3.84TB)
第一步是Purge the device,让NVMe SSD处于一个初始状态,这里我们通过nvme fomat /dev/nvme0n1命令实现。第二步便是预处理。使用128k顺序写全盘写两遍,然后进行4个小时的4k随机写处理。(需要指出的是随机写预处理并没有在SNIA测试规范中体现)
fio --ioengine=libaio --direct=1 --thread --norandommap --filename=/dev/nvme0n1 --name=init_seq --output=init_seq.log --rw=write --bs=128k --numjobs=1 --iodepth=64 --loops=2
fio --ioengine=libaio --direct=1 --thread --norandommap --filename=/dev/nvme0n1 --name=init_rand --output=init_rand.log --rw=randwrite --bs=4k --numjobs=4 --iodepth=128 --ramp_time=60 --runtime=14400 --time_based --group_reporting
接下来测试负载使用随机IO模型,Block-size和读写比设置如下表,两者共56种组合,每个组合测试1分钟:
Block-size | 1024k,128k,64k,32k,16k,8k,4k,512 |
---|---|
读写比 | 100/0, 95/5, 65/35, 50/50, 35/65, 5/95,0/100 |
这样的测试连续执行5轮,并获取fio的测试日志,一共282个日志文件(包含顺序写和随机写两个预处理log):
Fio生成的log文件格式统一,下面是第一轮4k随机写的log内容:
[root@localhost resfinal]# cat 0_4k_0.log
mytest: (g=0): rw=randrw, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=64
...
fio-3.3
Starting 8 threads
mytest: (groupid=0, jobs=8): err= 0: pid=1375: Thu Sep 19 02:07:46 2019
write: IOPS=106k, BW=415MiB/s (435MB/s)(24.3GiB/60011msec)
slat (nsec): min=931, max=3846.1k, avg=6832.60, stdev=4960.12
clat (nsec): min=1342, max=32617k, avg=4813506.02, stdev=3245727.52
lat (usec): min=14, max=32622, avg=4820.53, stdev=3245.72
clat percentiles (usec):
| 1.00th=[ 184], 5.00th=[ 611], 10.00th=[ 1057], 20.00th=[ 1926],
| 30.00th=[ 2769], 40.00th=[ 3589], 50.00th=[ 4359], 60.00th=[ 5145],
| 70.00th=[ 5997], 80.00th=[ 7177], 90.00th=[ 9110], 95.00th=[11076],
| 99.00th=[14746], 99.50th=[15926], 99.90th=[18744], 99.95th=[19792],
| 99.99th=[23200]
bw ( KiB/s): min=50312, max=58238, per=12.53%, avg=53196.13, stdev=1175.02, samples=960
iops : min=12578, max=14559, avg=13298.85, stdev=293.75, samples=960
lat (usec) : 2=0.01%, 4=0.01%, 10=0.01%, 20=0.03%, 50=0.21%
lat (usec) : 100=0.26%, 250=0.99%, 500=2.34%, 750=2.71%, 1000=2.79%
lat (msec) : 2=11.61%, 4=24.66%, 10=47.00%, 20=7.35%, 50=0.04%
cpu : usr=4.00%, sys=14.27%, ctx=4932079, majf=0, minf=19
IO depths : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.1%, >=64=100.0%
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.1%, >=64=0.0%
issued rwt: total=0,6371943,0, short=0,0,0, dropped=0,0,0
latency : target=0, window=0, percentile=100.00%, depth=64
Run status group 0 (all jobs):
WRITE: bw=415MiB/s (435MB/s), 415MiB/s-415MiB/s (435MB/s-435MB/s), io=24.3GiB (26.1GB), run=60011-60011msec
Disk stats (read/write):
nvme0n1: ios=129/6360259, merge=0/0, ticks=13/30567537, in_queue=30852566, util=100.00%
接下来我们选取4K随机写的5个日志,使用SNIA给出的公式判断NVMe SSD是否处于稳态。在此我们使用没有做预处理的盘运行了测试脚本作为对照组。
首先是实验组和对照组的对比如下:
可以看出,没有经过预处理的测试,第一轮结果明显高于稳态,并且随着测试的进行,性能越来越趋近于稳态的值。经过预处理的则保持稳定。接下来使用SNIA的方法判断PBlaze5的5轮测试是否在稳态。先给出根据测试结果得出的表格(下文测试均指经过预处理的测试):
第一条判断的条件是最大值(106777.6 )与最小值(105344.0)的差(1433.6),不能超过平均值(106036.5)的20%(21207.3)。本次测试符合这一条件,测试结果有效。
第二条判断条件是测试结果的最佳线性回归线的最大值(106178.6)与最小值(105894.5)的差(284.1)不能超过平均值(106036.5)的10%(10603.7)。本次测试符合这一条件,测试结果有效。
如此我们便根据SNIA的规范进行了一次比较完整的测试,并根据4k随机写的IOPS结果进行了稳态的验证。预处理的意义就是通过顺序写和复杂的随机写操作让盘进入一个相对的性能稳定期,而稳态是NVMe SSD在整个生命周期中将是持续时间最长,也是对企业业务影响最长远的一个状态,稳态下NVMe SSD的测试也因此具有非常高的参考价值。我们也建议企业能够根据自身业务场景设计测试用例的同时也注重将NVMe SSD先进行预处理。
相关阅读:
Solid State Storage (SSS) Performance Test Specification (PTS) v2.0.1(SNIA)
https://www.snia.org/sites/default/files/technical_work/PTS/SSS_PTS_2.0.1.pdf
SSD Performance测试简介
https://ssdfans.com/blog/2017/02/23/ssd-performance测试简介/
最后
以上就是怡然蜜粉为你收集整理的NVMe SSD测试为何要先做预处理?的全部内容,希望文章能够帮你解决NVMe SSD测试为何要先做预处理?所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复