读高性能MySQL(第4版)笔记04_操作系统和硬件优化

1. 从软件本身和它运行的典型工作负载来看,MySQL通常也更适合运行在廉价硬件上

2. 基本资源

2.1. CPU

2.2. 内存

2.3. 磁盘

2.4. 瓶颈

2.5. 网络资源

3. CPU

3.1. 最常见的瓶颈是CPU耗尽

3.2. 检查CPU使用率来确定工作负载是否受CPU限制

3.3. 低延迟(快速响应时间)

3.3.1. 需要更快的CPU,因为每个查询将只使用一个CPU

3.4. 高吞吐量

3.4.1. 如果可以同时运行多个查询,那么可以使用多个CPU为查询提供服务

4. 内存

4.1. 内存耗尽的情况也会发生,但通常只在你试图将太多内存分配给MySQL时才会发生

4.2. 配置大内存的主要原因并不是为了在内存中保存大量数据,而是为了避免磁盘I/O

4.3. 磁盘I/O比访问内存中的数据要慢几个数量级

4.4. 如果有足够的内存,可以完全避开磁盘读取操作

4.5. 如果所有数据都能装入内存,那么一旦服务器的缓存预热完成,每次读取都将是一次缓存命中

4.6. 写入可以像读取一样在内存中执行,但迟早必须被写入磁盘,才能持久保留数据

4.7. 缓存可以延迟写操作,但缓存不能像消除读操作那样消除写操作

4.8. 多次写操作,一次刷新

4.8.1. 一个数据片段可以在内存中被多次更改,而无须每一次都将新值写入磁盘

4.8.2. 当数据被最终刷新到磁盘时,自上次物理写入以来发生的所有修改都将被持久化

4.9. I/O合并

4.9.1. 许多不同的数据片段可以在内存中被修改,这些修改可以被收集在一起,因此物理写可以作为单个磁盘操作执行

4.9.2. 提前写日志(write-ahead logging)策略

4.9.2.1. 允许在内存中更改页面,而不用将更改刷新到磁盘,这通常涉及随机I/O,速度非常慢

4.9.2.2. 将更改的记录写入顺序日志文件,这样要快得多

4.9.2.3. 后台线程可以稍后将修改过的页面刷新到磁盘,这样做可以优化写操作的性能

4.10. 写操作从缓冲中获益,因为可以将随机I/O转换为顺序I/O

4.11. 异步(缓冲)写操作通常由操作系统处理,并且是被成批处理的,因此可以更优地被刷新到磁盘

4.12. 同步(无缓冲)写入必须等待数据落盘

5. 固态(闪存)存储

5.1. I/O饱和也会发生,但比CPU耗尽的频率低得多

5.2. 用HDD硬盘时,最好尝试找到一个有效的内存/磁盘比率

5.2.1. HDD延迟较高、IOPS较低

5.3. 使用SSD时,内存对磁盘的比率就变得不那么重要了

5.4. 固态设备对于提高服务器整体性能非常有用,现在通常应该成为数据库的标准配置,尤其对于OLTP工作负载

5.4.1. SSD通常比HDD快10到20倍

5.4.2. 只有在预算极为有限的系统中,或者在需要惊人的高达数PB的磁盘空间的数据仓库场景下,才考虑继续使用HDD

5.5. 比硬盘驱动器明显更好的随机读写性能

5.6. 闪存设备读的能力通常略好于写的能力

5.7. 比硬盘驱动器更好的顺序读写性能

5.8. 比硬盘驱动器更好的并发支持

5.8.1. 只有在拥有大量并发性的情况下,闪存设备才能真正实现最高吞吐量

5.9. 固态存储设备使用非易失性闪存芯片组成的单元

5.9.1. 非易失随机访问内存(NVRAM)

5.10. 固态存储建立在闪存之上

5.11. 闪存的特点

5.11.1. 可以被快速地多次读取,而且以很小的单元读取数据

5.11.2. 写入则要困难得多

5.11.2.1. 只有进行特殊的擦除操作之后,存储单元才能被重新写入数据,并且每次擦除的块大小较大

5.12. 写操作的限制是固态存储复杂性的原因

5.12.1. 为了使写操作能够很好地执行,并避免过早地耗尽闪存块写寿命,设备必须能够重新定位页面,并执行垃圾收集和所谓的损耗均衡

5.13. 为了使某些块保持新鲜并为新的写入做好准备,设备会回收块

5.14. 100GB文件在160GB的SSD上的性能与在320GB的SSD上的性能是不同的

5.14.1. 当没有空闲块时,必须等待擦除操作完成,从而导致速度减慢

5.14.2. 写入空闲块需要几百微秒,但擦除速度要慢得多,通常需要几毫秒

6. RAID

6.1. 存储引擎通常将数据/索引保存在单个大文件中,这意味着RAID通常是存储大量数据的最佳选项

6.2. 不要认为RAID是数据安全方面的强有力的保证

6.2.1. RAID并不能消除,甚至不能减少备份的需要

6.3. 保存在损坏的物理媒介中的数据很少被访问,可能几个月都不会被发现,直到尝试读取数据,或者当另一个驱动器出现故障,RAID控制器尝试使用损坏的数据重建阵列时才发现问题

6.3.1. 硬盘空间越大,出现这种情况的可能性就越大

6.4. 大多数控制器都提供了一些软件来报告阵列的状态,你需要对此进行跟踪,否则可能完全不知道驱动器已出现故障

6.4.1. 到第二个驱动器出现故障时就太晚了

6.5. 通过定期主动检查阵列的一致性,可以降低潜在的损坏风险

6.6. 很多RAID控制器不能很好地处理大数据块

6.7. RAID缓存是物理安装在硬件RAID控制器上的(相对)少量内存

6.7.1. 在RAID缓存中缓存读取都是浪费内存

6.8. RAID控制器的内存是一种稀缺资源,应该明智地使用它

6.9. 对事务日志发出fsync()调用,并在启用sync_binlog的情况下创建二进制日志,但除非控制器有备用电池单元(BBU)或其他非易失性存储,否则不应启用写缓存

6.9.1. 硬盘也可能会撒谎。应该确保在fsync()时刷新缓存,或者干脆在没有备用电池时禁用它们

6.9.2. 当安装新硬件时,最好进行真正的暴力碰撞测试(例如把电源插头拔出来)。这通常是发现细微的错误配置或偷偷摸摸的硬盘行为的唯一方法

6.10. 要测试RAID控制器的BBU是否真的可靠,请确保将电源线拔下一段时间

6.10.1. 有些BBU设备在没电的情况下无法维持足够的时间(将RAID缓存的数据刷新到磁盘

6.10.2. 一个环节出问题可能会导致整个存储系统链变得无用

6.11. RAID 0

6.11.1. 最便宜和性能最好的RAID配置

6.11.2. 永远不适合用于生产数据库

6.11.3. 在开发环境中,当服务器完全失效也不会变成突发事件时,可以选择RAID 0

6.11.4. 不提供任何冗余

6.11.5. RAID 0阵列的故障概率高于任何单磁盘的故障概率,而不是更低

6.12. RAID 1

6.12.1. 良好的读性能,并且可以跨磁盘复制数据

6.12.2. 良好的冗余

6.12.3. 读取速度略高于RAID 0

6.12.4. 顺序写入不需要许多底层磁盘就能执行得很好

6.12.5. 需要冗余但只有两个硬盘驱动器的低端服务器的典型选择

6.12.6. 大多数操作系统都允许你轻松地创建软件RAID 0和RAID 1卷

6.13. RAID 5

6.13.1. 将数据分布在具有分布式奇偶校验块的多块磁盘上,以便在任何一块磁盘出现故障时,可以从奇偶校验块重建数据

6.13.2. 如果两块磁盘同时出现故障,整个卷将无法恢复

6.13.2.1. 丢失两块磁盘时会产生灾难性的后果

6.13.3. RAID 5的可伸缩性不能超过10块磁盘

6.13.4. 良好的RAID 5的性能在很大程度上依赖于RAID控制器的缓存,这可能与数据库服务器的需求相冲突

6.14. RAID 6

6.14.1. 允许你在承受两次磁盘故障的情况下仍然能重建阵列

6.14.2. 计算额外的奇偶校验会使写操作比RAID 5慢

6.15. RAID 10

6.15.1. 一个非常好的数据存储选择

6.15.2. 条带化的镜像对组成,因此在读写方面都能很好地被扩展

6.15.2.1. 最佳的条带块大小取决于工作负载和硬件

6.15.2.2. 对于随机I/O来说,拥有较大的块大小是很好的,因为这意味着可以从单个驱动器中满足更多的读取需求

6.15.3. 与RAID 5相比,它的重建速度快且容易

6.15.4. 以很好地在软件中被实现

6.16. RAID 50

6.16.1. 由条带化的RAID 5阵列组成,如果有很多磁盘,它可以很好地兼顾RAID 5的经济性和RAID 10的性能

6.16.2. 主要用于非常大的数据集,如数据仓库或非常大的OLTP系统

7. 网络

7.1. 延迟和带宽是网络连接的限制因素

7.2. 网络运行不正常是主要的性能瓶颈

7.3. 数据包丢失是一个常见的问题

7.3.1. 即使是1%的丢失也足以导致性能显著下降,因为协议栈中的各个层都会尝试通过等待一段时间然后重新发送数据包等策略来解决问题,这会增加额外的响应时间

7.4. DNS解析异常中断或缓慢成为一个致命弱点

7.4.1. 对于生产服务器来说,启用skip_name_resolve是一个好主意

7.4.2. 当MySQL收到连接请求时,它会同时进行正向和反向DNS查找

7.4.3. 如果启用skip_name_resolve选项,MySQL不会进行任何DNS查找

7.4.3.1. 意味着用户账号在host列中只能有IP地址、“localhost”或IP地址通配符

7.4.3.2. host列中包含主机名的任何用户账号都将无法登录

8. 文件系统

8.1. 文件系统是在数据库中保证数据完整性的最低层

8.2. Windows

8.2.1. 只有一个(NTFS)是真正可行的

8.3. GNU/Linux

8.3.1. 大多数时候,给定的文件系统跟其他文件系统相比不会有明显的差别

8.3.2. 只有在某些情况下,达到文件系统的处理极限时,例如,需要处理高并发性、处理许多文件、碎片,等等,不同文件系统的差异才会体现出来

8.3.3. 最好使用日志型文件系统,如ext4、XFS或ZFS

8.3.4. 建议使用XFS文件系统,并将交换率和磁盘队列调度器设置为适合于服务器的值

8.4. 磁盘队列调度器

8.4.1. 完全公平排队,即CFQ(Complete FairQueuing)

8.4.2. 在MySQL的工作负载类型下,CFQ会导致非常糟糕的响应时间,因为会不必要地阻塞队列中的一些请求

8.4.3. 不要使用CFQ,它可能会导致严重的性能问题

8.5. 内存和交换

8.5.1. 给MySQL分配大量内存后,它的表现最好

8.5.2. InnoDB使用内存作为缓存来避免磁盘访问

8.5.2.1. 意味着内存系统的性能会直接影响查询的速度

8.5.3. 当使用SSD时,性能损失不像使用HDD时那样明显

8.5.3.1. 仍然应该积极地避免交换,即使只是为了避免不必要的写操作,因为写操作可能会缩短磁盘整体寿命

8.5.4. 更改存储引擎读写数据的方式

8.5.4.1. 设置innodb_flush_method=O_DIRECT可以减轻I/O压力

8.5.4.2. 该参数仅对InnoDB有效

8.6. 很多技巧都是特定于内核版本的,所以要小心,特别是在升级时

8.7. Linux剖析器perf是一个非常有用的工具,可以用它来检查操作在系统级别发生的事情

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/71997.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python基础篇(17):模块与包

一、as 关键字的使用 1、as 关键字的作用:给导入的模块取别名 import 测试1 as Test_1 import 测试2 as Test_2Test_1.say_hello() Test_2.say_hello() 二、if __name__ __main__ 1、作用 测试当前模块所编写的代码块,根据业务自主选择需要运行的代…

2023 年高教社杯全国大学生数学建模竞赛题目 A 题 定日镜场的优化设计

A 题 定日镜场的优化设计 构建以新能源为主体的新型电力系统,是我国实现“碳达峰”“碳中和”目标的一项重要措施。塔式太阳能光热发电是一种低碳环保的新型清洁能源技术[1]。 定日镜是塔式太阳能光热发电站(以下简称塔式电站)收集太阳能的基…

网络编程套接字 | UDP套接字

前面的文章中我们叙述了网络编程套接字的一些预备知识点,从本文开始我们就将开始UDP套接字的编写。本文中的服务端与客户端都是在阿里云的云服务器进行编写与测试的。 udp_v1 在v1的版本中我们先来使用一下前面讲过得一些接口,简单的构建一个udp服务器…

OceanBase 4.1解读:读写兼备的DBLink让数据共享“零距离”

梁长青,OceanBase 高级研发工程师,从事 SQL 执行引擎相关工作,目前主要负责 DBLink、单机引擎优化等方面工作。 沈大川,OceanBase 高级研发工程师,从事 SQL 执行引擎相关工作,曾参与 TPC-H 项目攻坚&#x…

NUC980webServer开发

目录 1.RTL8189FTV驱动移植 2.wifi配置工具hostapd移植 1.openssl-1.0.2r交叉编译 2.libnl-3.2.25.tar.gz交叉编译 3.hostapd-2.9.tar.gz交叉编译 4.移植相关工具到开发板 1.RTL8189FTV驱动移植 1. 把驱动文件源码放在linux源码的drivers/net/wireless/realtek/rtlwifi/目录…

【内存管理】C与C++的内存管理异同点

C/C程序内存区域划分 栈又称堆栈:存放非静态局部变量/函数参数/返回值等等,栈是向下增长的。内存映射段:高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存,做进程间通信。堆&…

LeetCode 1113.报告的记录

数据准备 Create table If Not Exists Actions (user_id int, post_id int, action_date date, action ENUM(view, like, reaction, comment, report, share), extra varchar(10)); Truncate table Actions; insert into Actions (user_id, post_id, action_date, action, ext…

Mybatis传递实体对象只能直接获取,不能使用对象.属性方式获取

mybatis的自动识别参数功能很强大,pojo实体类可以直接写进mapper接口里面,不需要在mapper.xml文件中添加paramType,但是加了可以提高mybatis的效率 不加Param注解,取值的时候直接写属性 //这里是单参数,可以不加param&#xff01…

软件测试/测试开发丨Web自动化 测试用例流程设计

点此获取更多相关资料 本文为霍格沃兹测试开发学社学员学习笔记分享 原文链接:https://ceshiren.com/t/topic/27173 一、测试用例通用结构回顾 1.1、现有测试用例存在的问题 可维护性差可读性差稳定性差 1.2、用例结构设计 测试用例的编排测试用例的项目结构 1…

CMakeList.txt

CMakeList.txt的写法 前言一个最近写好的CMakeList.txt对上边CMakeList.txt的说明修改 前言 复习一下CMakeList.txt的写法,以下面的一个CMakeList.txt为例 一个最近写好的CMakeList.txt cmake_minimum_required(VERSION 3.17)project(QtVTKProject)# INCLUSION OF Qt # set(…

python开发基础篇1——后端操作K8s API方式

文章目录 一、基本了解1.1 操作k8s API1.2 基本使用 二、数据表格展示K8s常见资源2.1 Namespace2.2 Node2.3 PV2.4 Deployment2.5 DaemonSet2.6 StatefulSet2.7 Pod2.8 Service2.9 Ingress2.10 PVC2.11 ConfigMap2.12 Secret2.13 优化 一、基本了解 操作K8s资源api方式&#xf…

算法通关村-----快速排序的应用

数组中的第K个最大元素 问题描述 给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。详见leetcode215 问题分析 之前我们已经使用堆排序/堆查找的…

高等数学刷题

两个公式本质都是相同的 Π/2 1^∞类型

【解决】mysqladmin flush-hosts

问题 mysql出现 mysqladmin flush-hosts,是因为其他客户机连接错误次数过多时,mysql会禁止客户机连接。 解决方法 1、进入服务器数据库,打开数据库命令行界面输入 flush hosts; 此时便可连接 2、可以.修改mysql配置文件,在[…

用户促活留存新方式——在APP中嵌入小游戏

随着APP同类产品的不断出现,APP开发者们面临着激烈的竞争,很多APP下载后被新的APP取代,获客成本越来越高。同时开发者还会面临用户粘性差、忠诚度低、用完即走、留存困难,商业化价值被大大缩减。 在APP中植入小游戏来提高用户活跃…

指针的应用与用法

指针的应用场景 从刚才的需求看,指针似乎并不是刚需啊,为什么一定要用指针呢,那么难理解,这是因为有些应用场景非他不可: 1.访问单片机的寄存器; 2.函数调用时内存共享; 3.常用数据结构链表&…

半导体厂务液体泄漏问题的挑战与解决方案

在半导体制造领域,液体泄漏是一项极具挑战性的问题。半导体工厂内有着大量的化学品、工艺液体和废水系统,这些液体在制造过程中扮演着至关重要的角色。然而,液体泄漏可能会导致严重的生产中断、环境污染和安全风险。本文将探讨半导体厂务中的…

【Apollo 自动驾驶】Win11 中 WSL2 安装配置 Apollo 环境

【Apollo 自动驾驶】Win11 中 WSL2 安装配置 Apollo 环境 【1】Win11 WSL2 安装配置 Nvidia Cuda 【1.1】检查计算机硬件的显卡信息 计算机图标右击 -> 管理 -> 设备管理器 -> 显示适配器; 【1.2】检查对应显卡并安装 Nvidia 显卡驱动 下载对应的 Nv…

一点感受

做了两天企业数字化转型的评委,涉及全国最顶级的公司、最顶级的实际落地项目案例,由企业真实的落地团队亲自当面讲解。主要是为了了解了解真实的一线、真实的客户、真实的应用现状和应用水平。 (1)现状 我评审的涉及底层技术平台&…

pytorch学习——循环神经网络RNN讲解及其实现

参考书籍:8.6. 循环神经网络的简洁实现 — 动手学深度学习 2.0.0 documentation 参考视频:54 循环神经网络 RNN【动手学深度学习v2】_哔哩哔哩_bilibili 一.介绍 循环神经网络RNN(Recurrent Neural Network )是一类广泛应用于序列…