如何快速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介绍

相关文章
|
算法 数据库 异构计算
Milvus 2.3.功能全面升级,核心组件再升级,超低延迟、高准确度、MMap一触开启数据处理量翻倍、支持GPU使用!
Milvus 2.3.功能全面升级,核心组件再升级,超低延迟、高准确度、MMap一触开启数据处理量翻倍、支持GPU使用!
Milvus 2.3.功能全面升级,核心组件再升级,超低延迟、高准确度、MMap一触开启数据处理量翻倍、支持GPU使用!
|
编解码 Serverless
在函数计算FC用自带的SD1.5。加载切换也得10几秒。20秒。如果我使用容量性 1分多 正常吗?
在函数计算FC用自带的SD1.5。加载切换也得10几秒。20秒。如果我使用容量性 1分多 正常吗?
47 1
|
消息中间件 XML 前端开发
Activity.onStop() 延迟10秒?检测、定位、修复它!
Activity.onStop() 延迟10秒?检测、定位、修复它!
168 0
西门子S7-1200如何使用诊断缓冲区,查看CPU停机原因的方法
在西门子S7-1200中的诊断缓冲区是CPU系统存储器的一部分,诊断缓冲区中记录了由CPU或具有诊断功能的模块所检测到的事件和错误等。
西门子S7-1200如何使用诊断缓冲区,查看CPU停机原因的方法
|
存储 固态存储 算法
剖析QLC SSD硬件延迟的来源
不同的FW架构设计、FTL算法设计、NAND die plane/速率等的差异,都会直接影响SSD的性能与延迟,设计一块性能优越且稳定的SSD,是一项繁琐但具有很强艺术性的工程。
|
SQL 监控 Java
JFR 定位因为 SSL 导致 CPU Load 飚高的问题
JFR 定位因为 SSL 导致 CPU Load 飚高的问题
JFR 定位因为 SSL 导致 CPU Load 飚高的问题
|
缓存 监控 JavaScript
VS Code 是如何优化启动性能的?
本文主要是对 CovalenceConf 2019: Visual Studio Code – The First Second 这次分享的介绍,CovalenceConf 是一个以 Electron 构建桌面软件为主题的技术会议,这也是 VS Code 团队为数不多的对外分享之一(质量较高),主要分享了 VS Code 是如何优化启动性能的。
10543 4
VS Code 是如何优化启动性能的?
如何让glog性能提高10倍
优化glog源码,性能提高10倍
8669 0
|
Java Linux 芯片
系统稳定性——So Hot? 快给 CPU 降降温!
> 作者:夏明(涯海) > 创作日期:2019-08-14 > 专栏地址:[【稳定大于一切】](https://github.com/StabilityMan/StabilityGuide) CPU(Central Processing Unit)是计算机系统的运算和控制核心,是信息处理、程序运行的最终执行单元,相当于系统的“大脑”。当 CPU 过于繁忙,就像“人脑”并发处理
1307 0