如何快速debug定位SSD延迟问题?

简介: IO延迟分析是一项复杂而有趣的工程,需要带着好奇深挖每一个信息,总会有不同的风景。

一块固态硬盘设计背后,有硬件控制器,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可以提升随机性能,建议用户执行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延迟分析是一项复杂而有趣的工程,需要带着好奇深挖每一个信息,总会有不同的风景。如果你有不同的经验分享,欢迎留言交流~

参考信息:SNIA官网、Teledyne Lecroy WorkloadIntelligence介绍

相关文章
|
12月前
|
编解码 Serverless
在函数计算FC用自带的SD1.5。加载切换也得10几秒。20秒。如果我使用容量性 1分多 正常吗?
在函数计算FC用自带的SD1.5。加载切换也得10几秒。20秒。如果我使用容量性 1分多 正常吗?
47 1
|
SQL 存储 Ubuntu
打开general_log对性能的影响
打开general_log对性能的影响
1296 0
打开general_log对性能的影响
|
SQL 监控 关系型数据库
Intel PAUSE指令变化如何影响MySQL的性能
x86、arm指令都很多,无论是应用程序员还是数据库内核研发大多时候都不需要对这些指令深入理解,但是 Pause 指令和数据库操作太紧密了,本文通过一次非常有趣的性能优化来引入对 Pause 指令的理解,期望可以事半功倍地搞清楚 CPU指令集是如何影响你的程序的。
Intel PAUSE指令变化如何影响MySQL的性能
|
存储 固态存储 算法
剖析QLC SSD硬件延迟的来源
不同的FW架构设计、FTL算法设计、NAND die plane/速率等的差异,都会直接影响SSD的性能与延迟,设计一块性能优越且稳定的SSD,是一项繁琐但具有很强艺术性的工程。
|
缓存 监控 JavaScript
VS Code 是如何优化启动性能的?
本文主要是对 CovalenceConf 2019: Visual Studio Code – The First Second 这次分享的介绍,CovalenceConf 是一个以 Electron 构建桌面软件为主题的技术会议,这也是 VS Code 团队为数不多的对外分享之一(质量较高),主要分享了 VS Code 是如何优化启动性能的。
10374 4
VS Code 是如何优化启动性能的?
|
Web App开发 监控 前端开发
HBase工具之监控Region的可用和读写延时状况
1、介绍HBase集群上region数目由于业务驱动而越来越多,由于服务器本身,网络以及hbase内部的一些不确定性bug等因素使得这些region可能面临着不可用或响应延时情况。
1265 0
|
数据库 关系型数据库 Oracle
|
NoSQL 测试技术 时序数据库