基础设施助力双11(七):软硬件深度优化,让存储IO如丝般顺滑

简介: 众所周知,双11的稳定依赖于坚如磐石的系统,包括软件以及硬件,只有在软硬件都可靠的前提下,才可能保证流畅的用户体验。所以我们必须做到两手抓且两手都要硬才行,以下就让我们来看一个双11中软硬件深度结合优化的真实案例。

导读

众所周知,双11的稳定依赖于坚如磐石的系统,包括软件以及硬件,只有在软硬件都可靠的前提下,才可能保证流畅的用户体验。所以我们必须做到两手抓且两手都要硬才行,以下就让我们来看一个双11中软硬件深度结合优化的真实案例。

业务面临的挑战

某业务在使用某型号搭配新型NVME SSD的服务器过程中发现IO抖动问题,IO抖动造成了业务抖动,严重影响业务性能稳定性。

业务不仅关注NVME SSD本身的读写延时、IOPS,而且需要保证所有IO的延时、IOPS要保持稳定,不能剧烈抖动。

如下图所示,随着时间的变化,TPS的值发生剧跌抖动。我们需要将TPS和延时变得平滑、稳定,而不能发生剧烈抖动,保证业务QoS。

image.png

IO抖动根因

为了复现抖动问题,我们使用FIO工具进行压力测试。在测试过程中,增加了文件删除动作,进而发现了更严重的抖动问题 : IO带宽异常跌0。IO带宽异常跌0对业务来说,是隐藏的一个巨大风险。

下图是OS上删除满盘文件后的FIO性能测试数据,前2小时性能衰退明显。

image.png

以下是NVME SSD带宽异常跌0时的IOSTAT的数据。

image.png

为了定位和解决该问题,我们需要分析清楚NVME IO带宽跌0时系统处于何种状态:是NVME处理IO超时?还是卡在其他内核某个位置? 即跌0时是哪种状态:

    1)NVME SSD状态 ;

    2)LVM状态 ;

    3)FIO测试进程状态。

    

为了准确获取系统状态信息,我们编写了内核模块,成功抓取到写带宽跌0时,LVM设备、NVME设备、FIO进程等多个状态信息。

根据抓到跌0时的状态信息,我们分析了FIO整个写流程,发现内核代码中,NVME驱动和LVM驱动并未直接使用Linux内核的通用块设备层,也就是无法使用通用块设备层的IO拥塞控制功能,并且自己并未实现IO拥塞控制。

内核中,LVM和NVME驱动没有IO拥塞控制,导致块设备请求队列上的IO请求数量无限制增大。而文件系统的Journal/Metadata和Data混在一起,都平等地排在块设备请求队列上,驱动将所有数据一起回写到SSD上,造成累积的IO请求数量过多,进而导致Journal数据回写时间不可预期。

同步写要求Journal+Data同时完成,只有当前面的Journal写完成之后,才能进行下一步IO写。而Journal数据回写时间不可预期,就会引起阻塞后续IO写,进而写带宽异常抖动。

LVM和NVME驱动均不经过Linux内核通用块设备层(有IO拥塞控制功能),且自己未实现IO拥塞控制,于是出现IO异常跌0或异常抖动。

image.png

软硬件深度结合

在NVME驱动中实现了IO拥塞控制功能,可以解决软件层面引起的抖动问题,但我们发现因为NVME SSD硬件本身内部存在GC(Garbage Collection,垃圾回收)机制,同样还是会引起IO的剧烈抖动,所以在大压力场景下,仅优化NVME驱动(软件层面)仍然不能够满足业务的QoS要求,这就要求我们必须要考虑软硬件深度结合来进行优化。

在确认了SSD本身的抖动主要是由于内部GC导致之后,我们调整了OP(Over-provisioning,预留空间),再测试,下图是软硬件深度优化后的TPS和RT性能数据。

image.png

image.png

由上可见,我们通过增加NVME驱动IO拥塞控制 + 调整SSD OP,进行了软硬件深度结合的优化,从而保证该业务在双11最终实现了IO处理上的丝般顺滑,助力了基础设施对双11坚如磐石的保障。

我们还会在软硬件结合优化的道路上持续走下去,从而保证基础设施具备更强的可用性和可靠性!

目录
相关文章
|
9月前
|
存储 Java 芯片
BIO 阻塞IO流 数据存储
为了弄清楚 I/O 流 的执行原理,首先需要了解数据在磁盘中的存储方式。目前进行数据存储的磁盘分为两种:机械磁盘、固态硬盘。
|
4月前
|
人工智能 Cloud Native Java
云原生技术深度解析:从IO优化到AI处理
【10月更文挑战第24天】在当今数字化时代,云计算已经成为企业IT架构的核心。云原生作为云计算的最新演进形态,旨在通过一系列先进的技术和实践,帮助企业构建高效、弹性、可观测的应用系统。本文将从IO优化、key问题解决、多线程意义以及AI处理等多个维度,深入探讨云原生技术的内涵与外延,并结合Java和AI技术给出相应的示例。
153 1
|
6月前
|
缓存 Linux 调度
[kvm]硬盘IO优化
[kvm]硬盘IO优化
|
9月前
|
存储 搜索推荐 文件存储
IO、存储、硬盘、文件系统相关常识
IO、存储、硬盘、文件系统相关常识
74 2
|
8月前
|
存储 缓存 NoSQL
Redis为什么速度快:数据结构、存储及IO网络原理总结
Redis为什么速度快:数据结构、存储及IO网络原理总结
|
8月前
|
Java 开发者
Java IO流实战技巧:如何优化InputStream/OutputStream和Reader/Writer的使用?
【6月更文挑战第26天】Java IO流优化涉及缓冲、资源管理、字符编码和流式处理。使用Buffered流提高读写效率,如`BufferedInputStream`和`BufferedReader`。确保资源关闭使用try-with-resources,如`try (InputStream is = ...) {...}`。处理文本时指定编码,如`InputStreamReader(is, StandardCharsets.UTF_8)`防止乱码。流式处理大文件,分块读写避免内存溢出,以减少内存占用。这些技巧能提升程序性能和健壮性。
303 0
|
8月前
|
SQL 数据处理 API
实时计算 Flink版产品使用问题之holo的io以及cpu使用较为稳定,sink端busy一直在20%左右,有时候50%,该如何优化
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
9月前
|
Java 大数据 数据库
【Spring底层原理高级进阶】Spring Batch清洗和转换数据,一键处理繁杂数据!Spring Batch是如何实现IO流优化的?本文详解!
【Spring底层原理高级进阶】Spring Batch清洗和转换数据,一键处理繁杂数据!Spring Batch是如何实现IO流优化的?本文详解!
|
9月前
|
NoSQL Java Linux
【Linux IO多路复用 】 Linux 网络编程 认知负荷与Epoll:高性能I-O多路复用的实现与优化
【Linux IO多路复用 】 Linux 网络编程 认知负荷与Epoll:高性能I-O多路复用的实现与优化
221 0
|
9月前
|
Rust
【一起学Rust · 项目实战】命令行IO项目minigrep——重构优化模块和错误处理
【一起学Rust · 项目实战】命令行IO项目minigrep——重构优化模块和错误处理
89 0

热门文章

最新文章