(四十九)大白话线上数据库莫名其妙的随机性能抖动优化(下)

news/2024/3/29 16:16:52/文章来源:https://blog.csdn.net/zht245648124/article/details/129271285

上一篇文章我们已经给大家详细分析了有时候我们在数据库里执行查询或者更新语句的时候,可能SQL语句的性能会出现不正常的莫名其妙的抖动,平时可能几十毫秒搞定的,现在居然要几秒钟。

其实这种莫名其妙的性能抖动,我们在分析过底层的原理之后,就理解的很清楚了,根本原因还是两个。

第一个,可能buffer pool的缓存页都满了,此时你执行一个SQL查询很多数据,一下子要把很多缓存页flush到磁盘上去,刷磁盘太慢了,就会导致你的查询语句执行的很慢。

因为你必须等很多缓存页都flush到磁盘了,你才能执行查询从磁盘把你需要的数据页加载到buffer pool的缓存页里来。

第二个,可能你执行更新语句的时候,redo log在磁盘上的所有文件都写满了,此时需要回到第一个redo log文件覆盖写,覆盖写的时候可能就涉及到第一个redo log文件里有很多redo log日志对应的更新操作改动了缓存页,那些缓存页还没flush到磁盘,此时就必须把那些缓存页flush到磁盘,才能执行后续的更新语句,那你这么一等待,必然会导致更新执行的很慢了。

所以上述两个场景导致的大量缓存页flush到磁盘,就会导致莫名其妙的SQL语句性能抖动了

那今天我们来说说怎么尽可能优化MySQL的一些参数,减少这种缓存页flush到磁盘带来的性能抖动问题。

其实大家可以想一下,如果要尽量避免缓存页flush到磁盘可能带来的性能抖动问题,那么核心的就两点

第一个是尽量减少缓存页flush到磁盘的频率,第二个是尽量提升缓存页flush到磁盘的速度。

那你想要减少缓存页flush到磁盘的频率,这个是很困难的,因为平时你的缓存页就是正常的在被使用,迟早会被填满,一旦填满,必然你执行下一个SQL会导致一批缓存页flush到磁盘,这个很难控制,除非你给你的数据库采用大内存机器,给buffer pool分配的内存空间大一些,那么他缓存页填满的速率低一些,flush磁盘的频率也会比较低。

所以今天我们主要是给讲解第二个问题的优化,就是如何尽量提升缓存页flush到磁盘的速度

给大家举个例子,假设你现在要执行一个SQL查询语句,此时需要等待flush一批缓存页到磁盘,接着才能加载查询出来的数据到缓存页。

那么如果flush那批缓存页到磁盘需要1s,然后SQL查询语句自己执行的时间是200ms,此时你这条SQL执行完毕的总时间就需要1.2s了。

但是如果你把那批缓存页flush到磁盘的时间优化到100ms,然后加上SQL查询自己执行的200ms,这条SQL的总执行时间就只要300ms了,性能就提升了很多。

所以这里一个关键之一,就是要尽可能减少flush缓存页到磁盘的时间开销到最小。

如果要做到这一点,通常给大家的一个建议就是对于数据库部署的机器,一定要采用SSD固态硬盘,而不要使用机械硬盘,因为SSD固态硬盘最强大的地方,就是他的随机IO性能非常高。

而flush缓存页到磁盘,就是典型的随机IO,需要在磁盘上找到各个缓存页所在的随机位置,把数据写入到磁盘里去。所以如果你采用的是SSD固态硬盘,那么你flush缓存页到磁盘的性能首先就会提高不少。

其次,光是用SSD还不够,因为你还得设置一个很关键的参数,就是数据库的innodb_io_capacity,这个参数是告诉数据库采用多大的IO速率把缓存页flush到磁盘里去的。

举个例子,假设你SSD能承载的每秒随机IO次数是600次,结果呢,你把数据库的innodb_io_capacity就设置为了300,也就是flush缓存页到磁盘的时候,每秒最多执行300次随机IO,那你不是速度很慢么,而且根本没把你的SSD固态硬盘的随机IO性能发挥出来!

所以通常都会建议大家对数据库部署机器的SSD固态硬盘能承载的最大随机IO速率做一个测试,这个可以使用fio工具来测试

fio工具是一种用于测试磁盘最大随机IO速率的linux上的工具,如何使用,大家可以网上搜一下,非常的简单。

查出来SSD固态硬盘的最大随机IO速率之后,就知道他每秒可以执行多少次随机IO,此时你把这个数值设置给数据库的innodb_io_capacity这个参数就可以了,尽可能的让数据库用最大速率去flush缓存页到磁盘。

但是实际flush的时候,其实他会按照innodb_io_capacity乘以一个百分比来进行刷磁盘,这个百分比就是脏页的比例,是innodb_max_dirty_pages_pct参数控制的,默认是75%,这个一般不用动,另外这个比例也有可能会变化,这个比例同时会参考你的redo log日志来计算,但是这个细节大家不用关注了。

其实比例不比例的,我们这里优化不用关注,核心就是把innodb_io_capacity调整为SSD固态硬盘的IOPS也就是随机IO速率就可以了。

另外还有一个参数,是innodb_flush_neighbors,他意思是说,在flush缓存页到磁盘的时候,可能会控制把缓存页临近的其他缓存页也刷到磁盘,但是这样有时候会导致flush的缓存页太多了。

实际上如果你用的是SSD固态硬盘,并没有必要让他同时刷邻近的缓存页,可以把innodb_flush_neighbors参数设置为0,禁止刷临近缓存页,这样就把每次刷新的缓存页数量降低到最少了。

所以呢,针对这次讲的这个案例,就是MySQL性能随机抖动的问题,最核心的就是把innodb_io_capacity设置为SSD固态硬盘的IOPS,让他刷缓存页尽量快,同时设置innodb_flush_neighbors为0,让他每次别刷临近缓存页,减少要刷缓存页的数量,这样就可以把刷缓存页的性能提升到最高。

同时也可以尽可能降低每次刷缓存页对执行SQL语句的影响。

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

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

相关文章

带你掌握webSocket 和 socket.io的基本用法

两者的作用和区别 作用:使得前后端可以随时地相互沟通。什么是互相沟通呢?像网络请求这种就是客户端向服务端的单向的沟通,当然,网络请求也可以实现双向的沟通,比如ajax 轮询,就是浏览器开个定时器不断的发…

【Java】Java进阶学习笔记(四)—— 抽象类与接口

【Java】Java进阶学习笔记(四)—— 抽象类与接口一、抽象类1、抽象类的概念抽象类的定义格式2、抽象类的注意点抽象方法的介绍3、抽象类的具体作用4、抽象类实例二、接口(一)、接口的概念1、接口与类的区别2、接口特性3、抽象类和…

如何实现云原生?推荐的几个实用工具

云原生是一种软件开发和部署的方法,它依赖于容器、微服务和自动化运维。它能使应用更高效、可靠和可扩展,并适用于不同的云平台。 如果要更直接、更通俗地解释上述概念的话。 云的本源更准确地说是一种文化,一种潮流,它必然是云…

此网站可能不支持TLS1.2协议

问题描述 火狐浏览器版本:“97.0.1 (64 位)”,打开360网神设备Web管理地址时出现:“此网站可能不支持TLS1.2协议,而这是Firefox支持的最低版本。”,如下图所示。 原本是默认使用https协议打开的,看起来出问…

蓝桥杯每日一题:不同路径数(dfs深度优先)

给定一个 nm的二维矩阵,其中的每个元素都是一个 [1,9] 之间的正整数。 从矩阵中的任意位置出发,每次可以沿上下左右四个方向前进一步,走过的位置可以重复走。 走了 k 次后,经过的元素会构成一个 (k1) 位数。 请求出一共可以走出…

零基础机器学习做游戏辅助第十五课--原神自动钓鱼(五)完整效果

一、先上效果二、整理思路我们现在已经具备了所有需要的技术,我们梳理出所有技术的流程。判断当前钓鱼状态(未抛竿、已抛竿、上鱼中)。未抛竿,截图并识别图中所有鱼类,选择其中一个种类。根据以选择鱼类选择对应鱼饵。…

从一个实例配置引入Prometheus的PromQL语法

1. PromQL介绍 PromQL提供对时间序列数据进行逻辑运算、过滤、聚合的支持。应用于数据查询、可视化、告警处理 2. 基本用法 2.1 查询时间序列 点击Prometheus图标,进行查询页面。可以点击地图图标查看有哪些metrics name。输入要查询的metrics name和过滤条件,然后点击执行…

2023年功能测试还值得入行吗?

前言 鉴于笔者从13年入行IT行业,经历了只有开发没有测试的阶段,经历了14年只要会基本的功能测试在一线就能薪资过万的阶段,经历了17年只要会一点自动化,会一点性能就能蒙骗过面试官的阶段,更经历了19年所有面试官对于…

基于大规模边缘计算的千万级聊天室技术实践

当前直播成为一种流行趋势,带货直播,网红带货,明星在线演唱会等,进一步使得直播聊天室变成了一个当前必备的能力,面向大型,超大型的直播场景,技术上也在不断的进行迭代更新。 大规模边缘聊天室如…

如何或者无插件Web页面监控播放软件LiveNVR的固定视频流地址,实现大屏上墙、播放、视频分析等目的

1、LiveNVR介绍 LiveNVR的安防监控的视频直播,可以按标准的Onvif/RTSP协议接入监控设备,也可以通过海康、大华、天地伟业等厂家私有SDK接入监控,实现web页面的播放和录像回放。 可以分发HTTP-FLV、WS-FLV、WebRTC、RTMP、HLS(M3U8)、RTSP等多…

全球化趋势下,如何建设稳定高效的技术能力?

如果将全球化比作一场航行,每个期望走出去的企业都是水手,那么是造一艘属于自己的船,还是搭乘已有的船呢?在不同的时间和场景下,相信每个水手都有自己的答案。 近几年,在国际政经环境复杂变幻的形势之下&am…

ImportError: Can not find the shared library: libhdfs3.so解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。喜欢通过博客创作的方式对所学的知识进行总结与归纳,不仅形成深入且独到的理…

活动回顾|中文社区面对面·上海站

回顾来了! 「中文社区面对面」首次线下交流活动,于 2 月 26 日下午在上海德必世纪 WE 成功举办,迎来了 30 位上海小伙伴的热情参与!Jina AI 高级算法工程师王峰博士与大家分享 Jina AI 的“三驾马车”,百万粉丝B站效率…

4.文件管理

文章目录1、初识文件管理1.1、回顾1.2、文件的属性1.3、无结构文件/有结构文件1.4、文件之间应该怎样组织起来?1.5、操作系统应该向上提供哪些功能?1.6、从上往下看,文件应如何存放在外存?1.7、其他需要由操作系统实现的文件管理功…

【蓝桥杯嵌入式】点亮LED灯,流水灯的原理图解析与代码实现——STM32

🎊【蓝桥杯嵌入式】专题正在持续更新中,原理图解析✨,各模块分析✨以及历年真题讲解✨都在这儿哦,欢迎大家前往订阅本专题,获取更多详细信息哦🎏🎏🎏 🪔本系列专栏 - 蓝…

实践数据湖iceberg 第四十二课(业界视野)业界的流批一体架构

系列文章目录 实践数据湖iceberg 第一课 入门 实践数据湖iceberg 第二课 iceberg基于hadoop的底层数据格式 实践数据湖iceberg 第三课 在sqlclient中,以sql方式从kafka读数据到iceberg 实践数据湖iceberg 第四课 在sqlclient中,以sql方式从kafka读数据到…

React(三):脚手架、组件化、生命周期、父子组件通信、插槽、Context

React(三)一、脚手架安装和创建1.安装脚手架2.创建脚手架3.看看脚手架目录4.运行脚手架二、脚手架下从0开始写代码三、组件化1.类组件2.函数组件四、React的生命周期1.认识生命周期2.图解生命周期(1)Constructor(2&…

【封装xib补充 Objective-C语言】

一、那么首先,咱们就从这个结果来分析 1.就不给大家一步一步分析了,直接分析我们这里怎么想的, 首先,我们看到这样的一个界面,我们想,这些应用数据是不是来源于一个plist文件吧, 所以说,我们首先要,第一步,要懒加载,把这个plist文件中的数据,加载起来, 那么,因…

「JVM 高效并发」锁优化

为了线程间更高效的共享数据及解决竞争问题,提高程序执行效率,JDK 6 做了大量锁优化,如适应性自旋(Adaptive Spinning)、锁消除(Lock Elimination)、锁膨胀(Lock Coarsening&#xf…

机器学习知识总结 —— 21. 什么是主成分分析

文章目录什么是PCA(Principal Component Analysis)协方差矩阵什么是协方差协方差矩阵特征值与特征向量PCA降维什么是PCA(Principal Component Analysis) 在机器学习中,PCA(Principal Component Analysis&a…