存储 IO 性能优化策略、方案与瓶颈分析

2024-08-31 12:04

本文主要是介绍存储 IO 性能优化策略、方案与瓶颈分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

33fa78a49aa0b164dca8c2d7cc27153f.jpeg

存储 IO 性能优化策略、方案与瓶颈分析(15张图)

   

存储IO性能优化是难题,因为它通常涉及全局性问题,需要从应用、数据库、主机、网络和存储设备全IO链路栈各层考虑可能出现的性能问题或瓶颈。

一、不同应用数据的 IO 模型特点

下表概述了各种应用场景的IO大小、读写比例、随机和顺序比例,这些数据作为通用参考值。需要注意的是,该表并未涵盖所有应用类型,且在不同生产环境中,数值可能存在较大差异。因此,表1中的数据仅作为一个通用参考。

表1 应用数据的IO模型

31f9fdd888462248f2f29445d5656a79.jpeg

二、存储 IO 性能指标和计算公式

1. 三大存储IO性能指标:

在三大性能指标中,针对大IO应用的吞吐量评估更科学;而对于小IO应用如数据库,需通过IOPS和延时指标评测性能。只有高IOPS与低延时兼得,才能应对高并发且快速的数据库访问需求,如表2所示。

表2 三大存储IO性能指标

1600dcf7d80318b29d76dfb26c68a81a.jpegdf4e2fa1a63151a617e51341035093d9.jpeg

2. 其它重要的存储性能指标(表3):

表3 其它重要的存储性能指标

6cf9620ad6e33f7c757c19e331d0b053.jpeg

3. 各IO性能指标的计算和相互转换公式

IOPS、IO size、带宽和QueueDepth之间的计算转换公式如图1所示。请参考该图以获取详细信息。

20d76046bb899ab07a13a7f019041add.jpeg

图1 IOPS、IO size、带宽、QueueDepth之间的计算转换公式

4. 各性能指标在vdbench基准测试工具中的体现(如图2)

1f13fa7c31bf7535c606f9f0386d744a.jpeg

图2 各性能指标在vdbench基准测试工具中的体现

三、存储 IO 性能优化

1. 优化策略

存储IO性能优化工作需要一定的策略性(如表4):

表4 存储IO性能优化策略

2802657126cf1a14fe49ea30b235f654.jpeg9ed5cf49433eb387a51c52057bb95a84.jpeg

2. 优化方案

存储设备层优化方案(如图3):

5c60c8e13fa6544e9592cc5d923fb55d.jpeg

b93e51841e3e6d099512faf53cbb1ec5.jpeg

图3 存储设备层优化方案

网络层优化方案(图4):

dd55400c9037203abebebfb35165f53a.jpeg

图4 网络层优化方案

存储传输协议方案选择(如图5):

9e3cf042bfc0cbbc6298f2bf60659f8e.jpeg

图5 存储传输协议方案选择

主机层优化方案(如图6):

d51f7094f76e60b8583aa8e96424a08a.jpeg

图6 主机层优化方案

应用层优化方案(如图7):

9ac32033723d07638416b907867e7b6b.jpeg

图7 应用层优化方案

3. 传统关系型数据库的IO性能的瓶颈点分析(如图8)

51691a326d2f8728b4eb6935d752b95d.jpeg

图8 Oracle 数据文件和日志文件读写过程

如表5所示,OLTP系统中单进程LGWR可能成为瓶颈,特别是在无法保证在线日志IO写性能时,容易出现排队等LGWR进程现象。这也是传统关系型数据库相对脆弱之处,容易引发问题。

表5 关系型数据库data和log数据IO读写模型

44cee22a0c26e46dcb3147619a3d704c.jpeg

OLTP数据库存储性能优化思路(如图9):

018344688077bae555a5f7f9eed5574d.jpeg

图9 OLTP数据库存储性能优化思路

4. IO并发队列的考虑

队列深度(Queue-Depths)是衡量主机端单个LUN能同时处理的I/O操作数量的标准。以QD=32为例,这意味着在同一时刻,该LUN可以执行32个并行IO操作。

在SCSI命令层面,每个从发送端(initiator)主机HBA卡端口到接收端(target)存储HBA卡端口的IO请求都会占用一个队列条目。

通常来说,较高的队列深度意味着更好的性能。然而,当存储控制器/节点达到最大队列深度并耗尽资源时,它将拒绝新的传入命令,并通过返回QFULL回应主机,从而导致性能下降。因此,在大量主机访问存储控制器时,务必谨慎规划以避免QFULL条件导致系统性能显著降低甚至出现错误。

有关队列深度(Queue-Depths)计算的深入分析(表6):

表6 队列深度计算的深入分析

4f4a63888d7125a0f50f2ea8c3411839.jpeg

有关队列深度(Queue-Depths)注意事项:

队列深度是一种并发交易模拟机制,它在流水线上的每个不同环节设置缓冲空间,使正常流水线数据传送从紧耦合变成了松耦合。简单来讲,Queue-Depths 传送机制的系统中,整个系统的吞吐量和延迟由性能最差的那个部位决定。

队列深度是一种并发交易模拟机制,它通过在流水线上的每个不同环节设置缓冲空间,使得正常流水线数据传送从紧耦合变成了松耦合。使用Queue-Depths 传送机制的系统中,整个系统的吞吐量和延迟由性能最差的那个部位决定。

-对此,您有什么看法见解?-

-欢迎在评论区留言探讨和分享。-

这篇关于存储 IO 性能优化策略、方案与瓶颈分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1123853

相关文章

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

MyBatisPlus如何优化千万级数据的CRUD

《MyBatisPlus如何优化千万级数据的CRUD》最近负责的一个项目,数据库表量级破千万,每次执行CRUD都像走钢丝,稍有不慎就引起数据库报警,本文就结合这个项目的实战经验,聊聊MyBatisPl... 目录背景一、MyBATis Plus 简介二、千万级数据的挑战三、优化 CRUD 的关键策略1. 查

MySQL之InnoDB存储引擎中的索引用法及说明

《MySQL之InnoDB存储引擎中的索引用法及说明》:本文主要介绍MySQL之InnoDB存储引擎中的索引用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录1、背景2、准备3、正篇【1】存储用户记录的数据页【2】存储目录项记录的数据页【3】聚簇索引【4】二

MySQL之InnoDB存储页的独立表空间解读

《MySQL之InnoDB存储页的独立表空间解读》:本文主要介绍MySQL之InnoDB存储页的独立表空间,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、独立表空间【1】表空间大小【2】区【3】组【4】段【5】区的类型【6】XDES Entry区结构【

MySQL中的表连接原理分析

《MySQL中的表连接原理分析》:本文主要介绍MySQL中的表连接原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、表连接原理【1】驱动表和被驱动表【2】内连接【3】外连接【4编程】嵌套循环连接【5】join buffer4、总结1、背景

SQLite3 在嵌入式C环境中存储音频/视频文件的最优方案

《SQLite3在嵌入式C环境中存储音频/视频文件的最优方案》本文探讨了SQLite3在嵌入式C环境中存储音视频文件的优化方案,推荐采用文件路径存储结合元数据管理,兼顾效率与资源限制,小文件可使用B... 目录SQLite3 在嵌入式C环境中存储音频/视频文件的专业方案一、存储策略选择1. 直接存储 vs

python中Hash使用场景分析

《python中Hash使用场景分析》Python的hash()函数用于获取对象哈希值,常用于字典和集合,不可变类型可哈希,可变类型不可,常见算法包括除法、乘法、平方取中和随机数哈希,各有优缺点,需根... 目录python中的 Hash除法哈希算法乘法哈希算法平方取中法随机数哈希算法小结在Python中,

SpringBoot中4种数据水平分片策略

《SpringBoot中4种数据水平分片策略》数据水平分片作为一种水平扩展策略,通过将数据分散到多个物理节点上,有效解决了存储容量和性能瓶颈问题,下面小编就来和大家分享4种数据分片策略吧... 目录一、前言二、哈希分片2.1 原理2.2 SpringBoot实现2.3 优缺点分析2.4 适用场景三、范围分片