一块固态硬盘设计背后,有硬件控制器,NAND闪存颗粒、DRAM,还有固件FTL算法等。SSD设计的本身其实是一件特别复杂的过程,需要考虑各种客户需求且要保证可靠性、性能、稳定性。

nvme时延iostat ssd io延迟_企业级

针对SSD的相关性能测试,SNIA也有专门针对SSD相关测试SPEC,同时各个SSD厂商也有很多独有的测试用例(一家SSD厂商的测试用例很多也是靠多年的填坑积累完善的)。现在看似SSD行业门槛很低,随便买个主控、NAND/DRAM颗粒就可以组装了(的确市场上有鱼龙混杂,有投机倒把之辈)。但是,如果真心要做出一款性能稳定的SSD,不但需要强大的技术实力,更需要丰富的经验积累。

nvme时延iostat ssd io延迟_人工智能_02

SSD出厂之前经过了严格的测试,到了用户手里,是不是就不会有延迟问题呢?答案是否定的。比如下面一幅图就是业内最经典案例,4KB随机写最开始性能会很高,因为SSD内部还没启动GC,当SSD随机预测完全后,此时4KB随机写才是稳态的性能。很多客户在拿到SSD后测试的数据和经过一段时间测试后的会出现明显的差异,在不了解SSD随机预热稳态的机理时,就会出现很多误解。用户使用方式,对延迟问题的定义也会有存在很大的差异。经常会出现一种情况:“IO延迟,在某些场景,是一种不是问题的问题!”

nvme时延iostat ssd io延迟_堆栈_03

不同的客户的业务场景,千差万别,SSD的设计也不无法100%兼顾所有复杂的IO负载类型。出现延迟问题并不可怕,可怕的是无从入手,不能快速debug定位延迟的来源

IO延迟定位前,我们先了解下Windows和Linux内核中的IO堆栈,简单理解IO的产生、流动过程、最终目的地。

第一图:Windows环境中IO堆栈

nvme时延iostat ssd io延迟_人工智能_04

第二图:Linux环境中IO堆栈

nvme时延iostat ssd io延迟_企业级_05

从上面的IO堆栈示意图来看:

  • Windows和Linux IO堆栈的基本逻辑是一致的
  • IO在软件层产生,经过文件系统、内核模块、驱动层,最终达到硬件存储设备SSD。

IO延迟通常是应用客户先感知到,用户也是从最上层感知,但是经过这么层的路径,最终的延迟来源是在哪一层?这个并不能很清晰的展示,这也导致很多场景下,SSD也成为了背锅侠,不管什么原因导致的IO异常,首先都会被先扣在SSD头上。所以,快速IO定界也是帮助SSD解放“背锅”压力的有效办法

目前用于IO延迟定界场景的软件,也有多种:

  • 在Windows场景下:开源的工具有perfmon,以及SNIA SSSI Workload I/O Capture Program (WIOCP) 推荐的hiomon,可以记录随机读写、顺序读写的延迟、队列深度QD,IO延迟统计等。

nvme时延iostat ssd io延迟_企业级_06

nvme时延iostat ssd io延迟_nvme时延iostat_07

  • Linux场景下,常用的经典开源工具也有blktrace,可以记录从IO产生,到最终返回的时间,跟IO分析工具iostat的延迟来源保持一致,与iostat一起搭配定位延迟问题最为合适。在硬件定位过程中,I2D代表进入内核IO workqueue队列到发送给硬件的时间。D2C代表驱动IO下发到硬件完成IO返回的时间。

nvme时延iostat ssd io延迟_人工智能_08

nvme时延iostat ssd io延迟_云计算_09

除了上面基础的开源IO分析工具,目前第三方也有专业的商用软件,比如Calypso的IOProfiler、Teledyne Lecroy的WorkloadIntelligence。

nvme时延iostat ssd io延迟_堆栈_10

IO延迟定界过程中,如果定位延迟来源于硬件,此时,SSD的延迟记录能力也是至关重要。市场上目前只有少数的厂商在数据中心客户的强烈的需求下,有延迟定位功能。大部分SSD厂商还没这个功能。不过,随着OCP也开始关注SSD延迟定位能力,相信后续会有更多的场景加入这个功能

nvme时延iostat ssd io延迟_云计算_11

在拥有Latency Monitoring功能的SSD上,可以清楚知道,在上层用户看到延迟抖动的时候,SSD内部硬件延迟的真实分布,可以快速确定延迟是不是来自于硬件,让数据中心和SSD供应商都可以更加清楚业务的行为与SSD硬件的适配情况。

nvme时延iostat ssd io延迟_人工智能_12

以下几个是IO异常的案例,供大家参考:

案例1: 业务模型与延迟的关系

延迟升高的时候,队列深度和进程数也在相应地增加。这种情况多数是跟业务的使用方式有关。

nvme时延iostat ssd io延迟_企业级_13

案例2:Trim对延迟的影响

读延迟的升高的时间段,正好看到系统有Discard/Trim的操作。Trim操作会给读延迟带来极大的影响。虽然Trim可以提升随机性能(扩展阅读:SSD写放大的优化策略要统一标准了吗?),建议用户执行Trim要在业务低谷触发,不然上层会看到非常明显的延迟抖动。

nvme时延iostat ssd io延迟_企业级_14

案例3:CPU core与延迟的关系

CPU所有core中只有少数core或者个别core出现IO繁忙的情况,导致IO集中,延迟升高。这个就需要从系统角度优化IO使用模式。

nvme时延iostat ssd io延迟_企业级_15

nvme时延iostat ssd io延迟_企业级_16

案例4: 同一负载下,不同SSD表现也有明显差异

  • A/B/C/D/E/F:6个盘是消费级NVME SSD,容量在480GB-512GB
  • G/H/I:3个盘是企业级NVME SSD,容量在960GB-1000GB

nvme时延iostat ssd io延迟_人工智能_17

同一个负载下,企业级SSD G表现最差,消费级SSD E表现相对稳定,可以媲美企业级SSD。通常情况下,企业级SSD相对消费级SSD做了很多IO的优化。

nvme时延iostat ssd io延迟_堆栈_18