一块固态硬盘设计背后,有硬件控制器,NAND闪存颗粒、DRAM,还有固件FTL算法等。SSD设计的本身其实是一件特别复杂的过程,需要考虑各种客户需求且要保证可靠性、性能、稳定性。
针对SSD的相关性能测试,SNIA也有专门针对SSD相关测试SPEC,同时各个SSD厂商也有很多独有的测试用例(一家SSD厂商的测试用例很多也是靠多年的填坑积累完善的)。现在看似SSD行业门槛很低,随便买个主控、NAND/DRAM颗粒就可以组装了(的确市场上有鱼龙混杂,有投机倒把之辈)。但是,如果真心要做出一款性能稳定的SSD,不但需要强大的技术实力,更需要丰富的经验积累。
SSD出厂之前经过了严格的测试,到了用户手里,是不是就不会有延迟问题呢?答案是否定的。比如下面一幅图就是业内最经典案例,4KB随机写最开始性能会很高,因为SSD内部还没启动GC,当SSD随机预测完全后,此时4KB随机写才是稳态的性能。很多客户在拿到SSD后测试的数据和经过一段时间测试后的会出现明显的差异,在不了解SSD随机预热稳态的机理时,就会出现很多误解。用户使用方式,对延迟问题的定义也会有存在很大的差异。经常会出现一种情况:“IO延迟,在某些场景,是一种不是问题的问题!”
不同的客户的业务场景,千差万别,SSD的设计也不无法100%兼顾所有复杂的IO负载类型。出现延迟问题并不可怕,可怕的是无从入手,不能快速debug定位延迟的来源。
IO延迟定位前,我们先了解下Windows和Linux内核中的IO堆栈,简单理解IO的产生、流动过程、最终目的地。
第一图:Windows环境中IO堆栈
第二图:Linux环境中IO堆栈
从上面的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延迟统计等。
Linux场景下,常用的经典开源工具也有blktrace,可以记录从IO产生,到最终返回的时间,跟IO分析工具iostat的延迟来源保持一致,与iostat一起搭配定位延迟问题最为合适。在硬件定位过程中,I2D代表进入内核IO workqueue队列到发送给硬件的时间。D2C代表驱动IO下发到硬件完成IO返回的时间。
除了上面基础的开源IO分析工具,目前第三方也有专业的商用软件,比如Calypso的IOProfiler、Teledyne Lecroy的WorkloadIntelligence。
IO延迟定界过程中,如果定位延迟来源于硬件,此时,SSD的延迟记录能力也是至关重要。市场上目前只有少数的厂商在数据中心客户的强烈的需求下,有延迟定位功能。大部分SSD厂商还没这个功能。不过,随着OCP也开始关注SSD延迟定位能力,相信后续会有更多的场景加入这个功能。
在拥有Latency Monitoring功能的SSD上,可以清楚知道,在上层用户看到延迟抖动的时候,SSD内部硬件延迟的真实分布,可以快速确定延迟是不是来自于硬件,让数据中心和SSD供应商都可以更加清楚业务的行为与SSD硬件的适配情况。
以下几个是IO异常的案例,供大家参考:
案例1: 业务模型与延迟的关系
延迟升高的时候,队列深度和进程数也在相应地增加。这种情况多数是跟业务的使用方式有关。
案例2:Trim对延迟的影响
读延迟的升高的时间段,正好看到系统有Discard/Trim的操作。Trim操作会给读延迟带来极大的影响。虽然Trim可以提升随机性能(扩展阅读:SSD写放大的优化策略要统一标准了吗?),建议用户执行Trim要在业务低谷触发,不然上层会看到非常明显的延迟抖动。
案例3:CPU core与延迟的关系
CPU所有core中只有少数core或者个别core出现IO繁忙的情况,导致IO集中,延迟升高。这个就需要从系统角度优化IO使用模式。
案例4: 同一负载下,不同SSD表现也有明显差异
A/B/C/D/E/F:6个盘是消费级NVME SSD,容量在480GB-512GB
G/H/I:3个盘是企业级NVME SSD,容量在960GB-1000GB
同一个负载下,企业级SSD G表现最差,消费级SSD E表现相对稳定,可以媲美企业级SSD。通常情况下,企业级SSD相对消费级SSD做了很多IO的优化。
IO延迟分析是一项复杂而有趣的工程,需要带着好奇深挖每一个信息,总会有不同的风景。如果你有不同的经验分享,欢迎留言交流~