上一期我们对使用IOmeter进行SSD的测试入门了。这些数据能够真正说用服户吗?用户可能会质疑测试数据与实际应用当中的落差。
譬如,许多消费类SSD的随机写入的成绩比随机读还高——这显然违背了NAND Flash读快写慢的特点,背后是SLC缓存技术的影响。因此,稍微懂行的用户都会关心消费类SSD“出缓”后的性能,关心满盘时的缓存状态等等。这就是要对SSD的实际表现建立一个“正确预期”。
数据中心SSD没有SLC缓存,有没有数据“作弊”的可能呢?如果不存在出缓的说法,那么,它的真正性能如何测试出来?在这一期,我们重点讲讲如何获得可信的性能数据——其中的重点就是对SSD进行正确的预处理。
在讲预处理之前,我们先通过“混合读写”的概念,让大家理解SSD状态的复杂性。
搞懂混合读写
绝大多数存储设备在工作中是有读有写的。重点是,由于NAND Flash的特点决定,写入操作的时延比读操作要大得多。
如果有空白页,最理想的写入操作是直接对空白页编程,这通常在几十微秒即可完成。
如果没有空白页,但有已经标记为可回收的页,而且这些垃圾页还集中在一个块内,那就可以对这个块进行擦除操作,额外消耗一些时间,获得了若干空白页。随后进行写入。
如果垃圾页和有数据的页互相混杂,没有任何一个块是完全由垃圾页构成的,那就属于很倒霉的情况了,需要先做一下整理工作,把有效数据复制到其他空白页中,让原本的页标记为可回收。如此反复,直到某一个块凑满了垃圾页,再进行擦除。这样操作的复杂度很大,带来的延迟可能会达到毫秒级。
这里再补充一个小小的知识点。前面说过,若干页(page)构成了块(block),而若干块,就构成了一个NAND平面(plane)。平面是NAND进行读、写、擦除等操作的基本单位。如果需要写入的页和需要读取的页恰巧在一个平面内,通道数量再多的主控也只能依次等待任务完成,而无法进行并行操作。这可能会带来更为极端的延迟。
总而言之,如果在读的指令序列中混杂了写入操作,写操作的延迟难以一概而论,可能会让读操作队列等待很长时间。
由于消费类SSD实际应用的队列深度很浅,其实读和写操作基本上可以看做是相互独立的。另外,SLC Cache的存在也意味着多数写入是处于极理想的状态,延迟很低。因此,消费类SSD通常不需要考虑写操作拖累SSD的响应。但数据中心SSD的写操作就很难处于理想状态,需要重点考察混合读写的情况,甚至需要通过一些管理特性的改善来让数据页不要太“乱”(譬如某些形式的分区、条带操作等,这里就不做展开了)。
读和写操作混合才符合服务器的真实应用常态,至于具体的读写比例,需要根据预期部署的业务来定。根据经验,在线交易、虚拟化类的应用,读写比例大约是70:30的量级;CDN、AI等应用,是90:10。做视频点播、大数据应用的,可以不考虑做随机读写的测试,做90:10的顺序读写更为合理。相应的,我们也可以根据SSD的特点去预设其适合的应用领域,譬如DWPD为1的SSD,设计测试方案的时候,安排70:30的混合随机读写是没有错的;而DWPD小于0.5的SSD,做70:30的混合随机读写就是强人所难了,改为90:10更为合理。
获得可信的性能数据
在消费类SSD的测试文章中,大家可能会看到一种表达:在填充若干容量数据之后,让SSD静置若干时间,然后进行某某测试。这么做的目的是让SSD有机会进行垃圾回收,让SLC缓存容量尽量恢复,甚至包括降低温度,以期在后续的测试中获得更好的测试结果。当然,这不能称为作弊,因为个人电脑本来就是断断续续地工作的,连续读写大容量数据的时候并不多,进行适当的休整后进行的测试更符合真实情况。
然而,服务器的工作有峰谷之别,但很可能并没有休息的时候。因此,数据中心SSD特别关注的是在连续运行的情况下,它还能稳定地输出多少性能。用术语来说,就是需要考察SSD的“稳态”(Steady State)性能。前面曾经提到的“万秒图”可以看做是一种简易地观察SSD稳态性能的方式,这样的压力测试对于消费类产品而言是足够的,但对于容量较大的数据中心SSD并不具备普适性。稍后我们会专门介绍让数据中心SSD进入稳态的标准操作。
一个SSD在正常工作期间会经历三个阶段,参考SNIA的提法,分别是:
FOB(Fresh Out of the Box):就是全新的、刚开封的盘。经过安全擦除的SSD也近似于FOB状态。这个时候的盘所有的页都是空白的,任何写入操作都可以直接进行编程,不需要考虑擦除、垃圾回收等操作的影响。消费类SSD的标称性能都是处于这个状态。这个阶段的测试成绩可以看做是养精蓄锐之后的冲刺,漂亮,但不可持续。
Transition:过渡或者转换状态。这个状态的性能会明显低于全新时的表现,但是又高于稳定态。不同的SSD在这个阶段的性能表现和持续时间差异较大,这与主控、固件、介质都有关系。随着技术进步,较新式的数据中心SSD会比早期的SSD更容易度过这个阶段。这个阶段可以看做是跑步期间休息了一会儿,再次跑起来的时候显得还比较轻松,但也不可持续。
Steady State:稳定态或稳态。测试成绩比之前的要低,但波动不大了,譬如连续五次测试的平均性能变化不超过20%。这是长跑的真正状态,呼吸节奏均匀,对肌肉酸痛已经麻木,配速比较稳定。随着时间持续,性能可能会进一步下降,但变化比较平缓。
对于服务器而言,SSD进入稳态后的数据才是有参考价值的。在SNIA的示意图当中,SSD需要两三百分钟才进入稳定态。事实上,我们单项测试进行预处理(Preconditioning)的时间确实需要花几个小时,甚至十几、几十小时,尤其对于容量巨大的SSD而言。但是,要获得让用户有参考价值、令人信服的性能,这种代价是必须的。
如何有效地进行预处理?
只要SSD持续测试的时间够长,SSD总可以进入稳定态的——“万秒图”不够的话,那就搞“十万秒图”?真这样干就显得很盲目啊!
说到蛮干,嘿嘿……其实……我把预处理放在IOmeter的测试方法后面才说,是有“险恶用心”的。前面我教了大家把读啊写啊的测试项一股脑堆到任务列表里,甚至教大家逐次增加队列,测试总量很容易就堆积出来了。虽然每个测试也就10分钟而已,但任务多啊,这一通组合搞完,几个小时甚至几天就过去了。然后,发现数据不太可靠,这……大腿都得拍肿了!
所以,我们应该提前进行有意识、有效率地操作,让SSD尽快进入稳态。这个过程就叫做“预处理”(Preconditioning)。
预处理的本质就是确保把NAND Flash的所有页填满(垃圾)数据,让SSD的所有写操作都在相对低效率的情况下完成。这就如同人需要被逼到极度疲劳的状态下,才能更清楚地了解其基本功,包括技术、耐力、意志力,甚至道德底线——这是特种部队用地狱周进行选拔的模式。也只有经过这种严格的考核,数据中心SSD才能体现其远高于消费类产品的溢价。
由于SSD在标称容量之外,还有一些保留的空间(OP),所以,为了确保所有页被写入,设计的写入量一定要明显大于标称容量,通常操作就是直接满盘写两遍。而且这个写入过程必须是连续的,否则SSD一旦获得喘息之机,开始专心进行垃圾回收,那后面的情况就很难说了。多数快餐测试软件不能进行长时间的、稳定地写入,譬如消费类SSD常跑的CrystalDiskMark,单项测试时长最多选择60秒,循环10次,总时间不过10分钟而已。
简而言之,10分钟一个项目,做稳态阶段的测试足够,但做预处理是不够的。最适合做预处理的就是FIO,这个以后介绍,我们先介绍IOmeter做预处理的方法。
通常顺序读写测试使用128KB数据包,我们就建立一个128KB顺序写的项目。顺序写也是最快填满的方法了。
Worker可以只用1个,相当于1个线程。数据选择伪随机。I/O深度固定在16或者32就够了。
IOmeter做预处理不像FIO那么方便,后者可以设置相对于容量的循环,前者只能通过运行时间来间接控制写入量。我们可以用容量去除以标称的顺序写入速度,这样就可以预估写满一遍的时间。把这个时间乘2,那就是计划的持续写的时间。特别强调的是,基于标称速度的计算只对数据中心SSD有效,因为数据中心SSD标称的通常是稳态性能,是可信的。而消费类SSD标称的写入速度是极大值,出缓后的写入性能必然暴跌——除非你知道会跌到什么程度,否则拿什么数值当除数呢?这也侧面说明了“可预期”的性能是多么重要。
如果我们对测试对象的顺序写入性能没有自信,那就不设具体的时间,直接开始跑顺序写项目,IOmeter会不间断地运行。在此期间,我们可以看到平均写入速度。平均写入速度会逐步下降,当相对平稳的时候,我们就可以根据这个速度去估算合理的总时间,超过这个时间后手动结束测试,这样初步的预处理就算完成了。
我们也可以通过CystalDiskInfo之类的软件随时判读SSD的写入量变化。如果增量达到2倍容量,就可以停止写入。对于预设了时间的操作,如果写入量达到1.5倍容量,也是可以接受的,否则就只能设一个更长的写入时间,重新进行预处理。
预处理完成后,我们可以先进行简单的测试,不做太复杂的设置,看看数据是否稳定。初期可能会出现写入IOPS比较高的情况,如果10分钟左右就能进入正常区间就是比较顺利的。感觉比较稳之后,就可以大刑伺候了。
结语
经过三个阶段的学习,相信大家在Windows下已经可以熟练使用IOmeter了。虽然IOmeter的设置界面比快餐软件们复杂很多,但只要测试思路明确,设置起来还是很直观的。建立了自己的配置文件之后,操作起来就更是轻车熟路,碾压普通的数码UP主那是小菜一碟啊。
对于面向数据中心、企业市场的经销商、集成商,熟悉IOmeter只是在专业领域入了门。大家还是要进一步熟悉服务器主流操作系统Linux的实际操作,下一阶段,我们就要把FIO用起来。