数据库管理-第204期 数据库的IO掉速,也许是SSD的锅(20240615)

2024-06-16 06:28

本文主要是介绍数据库管理-第204期 数据库的IO掉速,也许是SSD的锅(20240615),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

数据库管理204期 2024-06-15

  • 数据库管理-第204期 数据库的IO掉速,也许是SSD的锅(20240615)
    • 1 SSD物理结构
    • 2 SSD颗粒类型
    • 3 DRAM & SLC Cache
      • 3.1 DRAM
      • 3.2 SLC Cache
      • 3.3 其他方式
    • 4 缓外降速
    • 总结

数据库管理-第204期 数据库的IO掉速,也许是SSD的锅(20240615)

作者:胖头鱼的鱼缸(尹海文)
Oracle ACE Pro: Database(Oracle与MySQL)
PostgreSQL ACE Partner
10年数据库行业经验,现主要从事数据库服务工作
拥有OCM 11g/12c/19c、MySQL 8.0 OCP、Exadata、CDP等认证
墨天轮MVP、认证技术专家、年度墨力之星,ITPUB认证专家、专家百人团成员,OCM讲师,PolarDB开源社区技术顾问,HaloDB外聘技术顾问、OceanBase观察团成员,青学会(青年数据库学习互助会)外部顾问
圈内拥有“总监”、“保安”、“国产数据库最大敌人”等称号,非著名社恐(社交恐怖分子)
公众号:胖头鱼的鱼缸;CSDN:胖头鱼的鱼缸(尹海文);墨天轮:胖头鱼的鱼缸;ITPUB:yhw1809。
除授权转载并标明出处外,均为“非法”抄袭

近期在一些朋友的非专业存储的全闪存储环境中,出现了一个有趣的现象:

  • 当数据量急速上升的过程中,整个数据库的IO的性能反应会有一个较大规模的下降,需要一段时间才能恢复IO性能
  • 当全闪存储整体存储空间使用量达到一定百分比后,数据库反应出来的整体IO会有一定下降且不稳定,一般需要提前做横向扩展并平衡数据

出现上面情况,数据库本身排查一般不会发现问题,那么换个思路,从SSD的角度来看看,为什么会出现这个问题。

1 SSD物理结构

不同于机械磁盘(HDD),通过磁头在磁盘刻录/读取信息,这需要去物理寻址。SSD的的运行方式就有点不同,SSD的核心主要有两部分:主控和闪存颗粒:
image.png

  • 主控芯片:通过M.2、U.2或PCIe接口使用PCIe总线与CPU直连或通过主板芯片组从CPU“继承”的PCIe总线与CPU相连;并将数据写入SSD的闪存颗粒中,从闪存颗粒中读取数据;融合数据存储、清理垃圾等工作
  • 闪存颗粒:实际存储数据的地方

(这里说明一下,一般来说服务器CPU可用的直连CPU的PCIe使可以支撑足够多的PCIe NVMe SSD的;通过主板芯片组扩展的PCIe通道一般为桌面级CPU,因存在共享通道,性能略低于直连CPU)

2 SSD颗粒类型

说起闪存颗粒类型之前,得先说一下闪存颗粒的最小存储单元,其实就是一个非常古老的硬件结构:浮栅晶体管,简单来说就是通过存储不同数量的电子(一般最多可存储7个电子)来判断存储的数据内容。然后通过海量的浮栅晶体管来存储数据,关于其他的组件就暂时放下不说了。
目前主流的存储颗粒有MLC、TLC、SLC:

  • SLC:一个浮栅晶体管可存储1bit数据,可存储两个内容:0-3个电子为1,4-7个电子为0
    image.png
  • MLC:一个浮栅晶体管可存储2bit数据,可存储4个内容:0-1个电子为11,2-3个电子为10,4-5个电子为01,6-7个电子为00
    image.png
  • TLC:一个浮栅晶体管可存储3bit数据,可存储8个内容:0个电子为111,1个电子为110,2个电子为101,3个电子为100,4个电子为011,5个电子为010,6个电子为001,7个电子为000
    image.png

从容量来看:SLC < MLC < TLC,越往右同样数量的浮栅晶体管可以存放更多数据,这也导致了越往左成本越高
从性能来看:SLC > MLC > TLC,越往左一个浮栅晶体管需要操作的次数更少,也不需要更加精确的电子控制;同时也需要更多的浮栅晶体管来存储相同大小的数据,多个浮栅晶体管可并行写入加速
从寿命来看:SLC > MLC > TLC,越往左单个浮栅晶体管擦写操作更少;越往右,浮栅晶体管出现需要融合数据的概率越大

3 DRAM & SLC Cache

首先,我们来算算,使用不同类型的闪存颗粒存放1TB数据大概需要多少个浮栅晶体管:

  • SLC:1024×1024×1024×1024
  • MLC:1024×1024×1024×1024/2
  • TLC:1024×1024×1024×1024/3

不需要计算结果,即便是TLC都是需要海量的浮栅晶体管来存放1TB数据。那么海量的浮栅晶体管存放数据,肯定不可能一个一个去检索,这里就需要FLT(FLash Translation Layer)表来记录逻辑数据和物理位置之间的关系。那么这个FLT放哪呢?怎么加速查询?这里一般来说主要有两种方案。

3.1 DRAM

这里可以在SSD中添加一个DRAM来存放FLT表:
image.png
众所周知,DRAM的IO性能是远高于闪存颗粒的,DRAM缓存FLT是可以极大提升检索数据物理位置映射的效率。另一方面,DRAM也可以作为写入缓存,以解决MLC、TLC的写放大问题(说白了就是排队累积对应量的数据再写入闪存颗粒,减少单个浮栅晶体管的空间浪费避免空间回收和融合出现)。

3.2 SLC Cache

尤其是使用TLC颗粒的SSD,可以通过将一部分TLC浮栅晶体管模拟成SLC模式,来缓存FLT表和写入缓存。
image.png
使用这种方式会增大主控的维护压力,而且会写入模拟SLC的数据最终会转换至TLC中,且数据量的整体提升会压缩模拟SLC的数量,这样一是会降低维护FLT和写入缓存的性能,另一方面会放大模拟SLC转换TLC操作量。最终当没有模拟SLC剩余时,SSD的性能会下降的十分明显。同时这种方式性能肯定比不过SSD内置DRAM。

3.3 其他方式

  • 在主控芯片中添加一块不大的区域缓存常用的FLT表信息
  • 闪存颗粒中划分固定区域模拟SLC模式来缓存部分常用的FLT表信息和写缓存
  • 向机器主内存借用一块区域来存放部分常用的FLT表信息

4 缓外降速

一般来说企业级SSD都会使用SLC闪存颗粒+较大的DRAM来兼顾寿命与性能,但是这样往往价格会高不少。经过观察发现,文章一开始出现问题的环境为了兼顾成本往往使用的是SSD是较小DRAM或者是模拟SLC缓存的民用级SSD。那么当数据暴增超过缓存容量时,会出现降速的现象,甚至会处罚浮栅晶体管的类型转换;当整体容量足够大时,SSD也会因为失去缓存而出现性能问题。

总结

本期稍微深入探讨了一下SSD的一些内部的东西,希望给大家多一个视角。
老规矩,知道写了些啥。

这篇关于数据库管理-第204期 数据库的IO掉速,也许是SSD的锅(20240615)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

SQL Server修改数据库名及物理数据文件名操作步骤

《SQLServer修改数据库名及物理数据文件名操作步骤》在SQLServer中重命名数据库是一个常见的操作,但需要确保用户具有足够的权限来执行此操作,:本文主要介绍SQLServer修改数据... 目录一、背景介绍二、操作步骤2.1 设置为单用户模式(断开连接)2.2 修改数据库名称2.3 查找逻辑文件名

SQL Server数据库死锁处理超详细攻略

《SQLServer数据库死锁处理超详细攻略》SQLServer作为主流数据库管理系统,在高并发场景下可能面临死锁问题,影响系统性能和稳定性,这篇文章主要给大家介绍了关于SQLServer数据库死... 目录一、引言二、查询 Sqlserver 中造成死锁的 SPID三、用内置函数查询执行信息1. sp_w

使用jenv工具管理多个JDK版本的方法步骤

《使用jenv工具管理多个JDK版本的方法步骤》jenv是一个开源的Java环境管理工具,旨在帮助开发者在同一台机器上轻松管理和切换多个Java版本,:本文主要介绍使用jenv工具管理多个JD... 目录一、jenv到底是干啥的?二、jenv的核心功能(一)管理多个Java版本(二)支持插件扩展(三)环境隔

如何解决Druid线程池Cause:java.sql.SQLRecoverableException:IO错误:Socket read timed out的问题

《如何解决Druid线程池Cause:java.sql.SQLRecoverableException:IO错误:Socketreadtimedout的问题》:本文主要介绍解决Druid线程... 目录异常信息触发场景找到版本发布更新的说明从版本更新信息可以看到该默认逻辑已经去除总结异常信息触发场景复

Python中bisect_left 函数实现高效插入与有序列表管理

《Python中bisect_left函数实现高效插入与有序列表管理》Python的bisect_left函数通过二分查找高效定位有序列表插入位置,与bisect_right的区别在于处理重复元素时... 目录一、bisect_left 基本介绍1.1 函数定义1.2 核心功能二、bisect_left 与

Spring中管理bean对象的方式(专业级说明)

《Spring中管理bean对象的方式(专业级说明)》在Spring框架中,Bean的管理是核心功能,主要通过IoC(控制反转)容器实现,下面给大家介绍Spring中管理bean对象的方式,感兴趣的朋... 目录1.Bean的声明与注册1.1 基于XML配置1.2 基于注解(主流方式)1.3 基于Java

基于Python+PyQt5打造一个跨平台Emoji表情管理神器

《基于Python+PyQt5打造一个跨平台Emoji表情管理神器》在当今数字化社交时代,Emoji已成为全球通用的视觉语言,本文主要为大家详细介绍了如何使用Python和PyQt5开发一个功能全面的... 目录概述功能特性1. 全量Emoji集合2. 智能搜索系统3. 高效交互设计4. 现代化UI展示效果

Druid连接池实现自定义数据库密码加解密功能

《Druid连接池实现自定义数据库密码加解密功能》在现代应用开发中,数据安全是至关重要的,本文将介绍如何在​​Druid​​连接池中实现自定义的数据库密码加解密功能,有需要的小伙伴可以参考一下... 目录1. 环境准备2. 密码加密算法的选择3. 自定义 ​​DruidDataSource​​ 的密码解密3

Maven项目中集成数据库文档生成工具的操作步骤

《Maven项目中集成数据库文档生成工具的操作步骤》在Maven项目中,可以通过集成数据库文档生成工具来自动生成数据库文档,本文为大家整理了使用screw-maven-plugin(推荐)的完... 目录1. 添加插件配置到 pom.XML2. 配置数据库信息3. 执行生成命令4. 高级配置选项5. 注意事

Linux查看系统盘和SSD盘的容量、型号及挂载信息的方法

《Linux查看系统盘和SSD盘的容量、型号及挂载信息的方法》在Linux系统中,管理磁盘设备和分区是日常运维工作的重要部分,而lsblk命令是一个强大的工具,它用于列出系统中的块设备(blockde... 目录1. 查看所有磁盘的物理信息方法 1:使用 lsblk(推荐)方法 2:使用 fdisk -l(