高性能MySQL-操作系统和硬件优化

操作系统和硬件优化

如有侵权,请联系~

如有错误,也欢迎批评指正~

本篇文章大部分是来自学习《高性能MySQL》的笔记

1、影响MySQL性能的因素

磁盘空间大小、可用的内存以及CPU资源、网络等都会限制系统的性能。

  • CPU饱和:这是最常见的瓶颈。当MySQL并行执行太多的查询或者少量的查询在CPU上运行时间太久,都会导致CPU饱和。
  • IO饱和:这种比CPU耗尽的频率低得多,因为目前普遍使用固态硬盘
  • 内存耗尽:如果企图分配太多的内存给MySQL的时候。

2、平衡内存和磁盘的资源

配置一个大的内存只是为了减少磁盘IO,提高相应,并不是将数据大量存储到内存中。综合考虑成本、速度等因素,平衡内存和磁盘的大小。数据的读写也都是先将数据保存到内存中或者是从内存中读取,然后异步的将内存中的数据刷新到磁盘【参考高性能MySQL-MySQL架构】。

只需要将工作集【你真正需要的数据】中的数据存储到内存中即可,不需要将所有的数据库数据都存储到内存中。

固态硬盘在2015年价格大幅度降低,所以目前大多数数据库的标配就是固态硬盘,除非是大规模的数据仓库系统或者是老旧的系统才会使用机械硬盘。

2.1 固态硬盘的垃圾回收

垃圾回收的目的是定期优化硬盘,确保硬盘高效运行并在整个生命周期内保持良好性能。与机械硬盘 (HDD) 不同,固态硬盘和其他 NAND 闪存无法覆盖现有数据。它们必须完成写入/擦除 (Program/Erase) 循环。闪存被分为块,块又被进一步分为页;数据在页级别被写入,在块级别被擦除。在数据可被擦除之前,原始块中的所有有效数据(页)必须首先被复制并写入到一个新块的空页中。要写入已被使用的数据块,固态硬盘控制器会先复制所有有效数据(仍在使用中的数据)并将其写入其他块的空白页,擦除当前块中的所有数据单元(有效数据和无效数据),然后开始将新数据写入刚刚擦除过的块。此过程称为垃圾回收。金士顿® 使用各种可利用专有技术执行垃圾回收 (GC)的 控制器,目的是保持尽可能多的空块,以便当固态硬盘必须写入数据时,不必等待块被擦除。

当可用空闲数据块变少,需要进行擦除操作的时候,速度会变慢。写入空闲磁盘需要几百微妙,但是擦除速度就慢很多,通常需要几毫秒。

3 磁盘配置

3.1 RAID性能优化

数据库一般都是使用RAID。RAID(冗余独立磁盘阵列,Redundant Array of Independent Disks)是一种将多个物理硬盘组合在一起以提高性能和冗余的存储技术。RAID 通过不同的配置和级别来实现数据冗余和访问速度的优化。

RAID工作原理:

RAID 通过将数据分散存储在多个硬盘上,以便提高性能和冗余。根据配置的不同,RAID 实现了以下功能:

  • 数据条带化:将数据分割并分配到多个硬盘上,实现并行读写,提高速度。
  • 数据镜像:在多个硬盘上创建相同的数据副本,提高冗余性。
  • 奇偶校验:计算和存储数据的奇偶校验信息,以便在硬盘故障时恢复数据。

常见的 RAID 级别:

RAID 0(条带化):RAID 0 将数据条带化(striping),即将数据分割并分布到多个硬盘上。特点:

  • 可以提高性能,数据在多个硬盘间分布,没有冗余;
  • 如果其中一个硬盘故障,则所有数据丢失。

RAID 1(镜像):RAID 1 将数据完全复制到两个或多个硬盘上,形成镜像。特点:

  • 性能:读取性能较高,因为可以从任一硬盘读取数据。
  • 冗余:提供数据冗余,能够容忍一个硬盘故障,数据仍然安全。
  • 存储效率:50%(存储容量为最小硬盘的容量)。

RAID 5(带奇偶校验的条带化):RAID 5 将数据和奇偶校验信息交替分布在所有硬盘上。特点:

  • 性能:提供良好的读性能,写性能略低于 RAID 0 和 RAID 1。
  • 冗余:能够容忍一个硬盘故障,数据可以通过奇偶校验信息恢复。
  • 存储效率:计算方式为(N-1)/N,其中 N 是硬盘的总数。

RAID还有RAID6、RAID10、RAID50、RAID60等。现在数据库开始使用memblaze和shannon固态硬盘,性能更好。

3.2 RAID监控、故障、恢复

虽然RAID提供了冗余能力,但是同时多块磁盘出现故障的可能行仍然很大。所以,使用RAID仍然需要备份。使用RAID进行数据恢复的时间取决于RAID的级别、磁盘速度、队列大小等等。

如果磁盘存放的数据很少被访问,并且磁盘损坏了,直到尝试获取这部分数据的时候才发现,而如果别的磁盘也损坏了,那就可能无法恢复。因此,需要对RAID控制器、RAID阵列进行监控。

常见的 RAID 监控工具

  • 硬件 RAID 控制器的监控软件
    • Dell PERC(PowerEdge RAID Controller)管理工具:用于 Dell 服务器的 RAID 控制器,可以监控和管理 Dell RAID 阵列。
    • HP Smart Array Configuration Utility:用于 HP 服务器的 RAID 控制器,提供监控和管理功能。
    • LSI MegaRAID:用于 LSI/Avago/Silicon Image 控制器的工具,支持多种 RAID 类型的管理。
  • 软件 RAID 管理工具
    • mdadm(Linux):用于管理 Linux 软件 RAID 阵列的命令行工具,允许监控和配置 RAID 设备。
    • Windows Storage Spaces:Windows 操作系统中的存储管理工具,可以监控和管理各种配置的磁盘,包括软件 RAID。
  • 第三方 RAID 管理工具
    • Array Management Software:如 Storage Manager、OpenManage等,这些工具可以提供更强大而集中的 RAID 阵列管理能力。
    • Nagios、Zabbix 等开源监控工具:可以通过插件监控 RAID 阵列的状态并提供警告。

3.3 RAID的配置

**RAID条带块大小:**最佳的条带块大小取决于工作负载和硬件。条带块太小就无法避免读取过程中涉及到多个驱动器;如果条带块太大,缓存的效率可能就会降低,最终可能会读取比实际需要的数据要多,读取很多无用的数据。

RAID缓存: RAID缓存是物理安装在硬件RAID控制器上的内存。当数据在磁盘和主机系统之间传输时,RAID缓存可以用来缓存数据。功能:

  • 缓存读操作。当控制器从磁盘中读取一些数据并将其发送给主机系统后,控制器就可以缓存这些数据;将来控制器能够满足未来对相同数据的请求,无需访问磁盘。这是最差的RAID缓存使用方式。因为操作系统和数据库服务器都有更大的缓存。如果其中一个命中缓存就不会使用RAID缓存,他们都命中不了缓存,RAID命中缓存的概率也很低。
  • 缓存预读取数据。如果RAID控制器注意到都是顺序的数据请求,它可能会决定进行预读取,即读取它预测不久将需要的数据。
  • 缓存写操作。RAID控制器可以将写操作缓冲到缓存中,然后合并多个写操作一起写到磁盘。
  • 内部操作。RAID内部操作也需要一些内存。

RAID控制器的内存比较稀缺,所以应该理智使用。尽量不要用于读操作,用于缓存写操作可以提高IO性能。很多控制器可以选择如何分配内存。有多少可以用于缓存写操作,有多少用于缓存读操作。建议RAID0、RAID1和RAID10 100%用于缓存写操作;RAID5应该为内部操作保留一些控制器内存,因为需要计算奇偶校验。

4、网络配置

  • 网络运行不正常。出现数据包丢失,这会导致性能出现下降
  • DNS解析异常中断或者缓慢。如果使用的主机名是域名不是IP,MySQL客户端会根据MySQL服务器的域名查找IP,然后进行通信;MySQL服务器接收到请求会根据客户端的IP进行反向DNS解析【IP查找域名】,将得到的域名再鉴权【mysql.user表】。如果在进行反向DNS解析的时候,异常或者缓慢也会影响性能。可以通过启用skip-name-resolve,跳过反向DNS,这样也就不能在user表中使用域名进行鉴权。
相关推荐
我是Superman丶4 分钟前
【Lua】java 调用redis执行 lua脚本
java·开发语言·junit
素雪风华8 分钟前
构建RAG混合开发---PythonAI+JavaEE+Vue.js前端的实践
java·vue.js·python·ai·语言模型·llms·qwen千问大模型
自学互联网16 分钟前
系统集成项目管理工程师学习笔记
笔记·学习
zm17 分钟前
服务器连接多客户端
java·javascript·算法
测试界萧萧33 分钟前
15:00开始面试,15:06就出来了,问的问题有点变态。。。
自动化测试·软件测试·功能测试·程序人生·面试·职场和发展
jllllyuz42 分钟前
matlab实现蚁群算法解决公交车路径规划问题
服务器·前端·数据库
charlie1145141911 小时前
基于Qt6 + MuPDF在 Arm IMX6ULL运行的PDF浏览器——MuPDF Adapter文档
arm开发·qt·学习·pdf·教程·设计·qt6
Warren981 小时前
Java面试八股Spring篇(4500字)
java·开发语言·spring boot·后端·spring·面试
晚秋大魔王1 小时前
OpenHarmony 开源鸿蒙南向开发——linux下使用make交叉编译第三方库——gnutls
java·开发语言
胡子发芽1 小时前
面试题:请解释Java中的垃圾回收机制(Garbage Collection, GC),并讨论不同的垃圾回收算法及其优缺点
java·jvm