(四十八)大白话线上数据库不确定性的性能抖动优化实践(上)

news2025/1/12 1:11:21

之前我们花费了很大篇幅来给大家深入和细致的讲解数据库在执行增删改这类更新语句时候的底层原理,这里涉及到了很多数据库内核级的概念,比如buffer pool、redo log buffer、lru/flush链表,等等,大家对数据库执行更新语句的原理都有了较为深入的理解。

同时我们还在这个基础之上,给大家深入分析了数据库的事务的底层原理,包括事务隔离和mvcc机制的原理和概念,以及多事务并发运行时的锁机制,如何让多个事务合理的在数据库内部并发执行,同时读写共享的数据。

接着我们就要给大家讲解关于数据库更新这块的一些生产实践案例了,主要会讲解数据库更新时候的性能抖动优化、各种奇葩的锁导致性能降低的问题以及死锁问题,包括删库跑路、数据丢失等问题。

相信大家学习完接下来这部分内容之后,对自己日常工作中,线上数据库出现的一些数据更新导致的锁、数据丢失等生产故障,都能自己进行排查、定位和解决了,也就达到了我们希望的大家通过学习专栏掌握生产级优化能力的初衷。

今天我们要给大家讲解的第一个生产案例,就是线上数据库时不时莫名其妙的来一次性能抖动的问题,而且造成性能抖动的还不是之前我们讲过的数据库锂电池充放电的问题,而是另外一个新的问题,跟我们之前讲解的原理是息息相关的。

大家都知道一件事情,那就是我们平时在数据库里执行的更新语句,实际上都是从磁盘上加载数据页到数据库内存的缓存页里来,接着就直接更新内存里的缓存页,同时还更新对应的redo log写入一个buffer中,如下图所示。

image-20230108194013490

那么大家都知道,既然我们更新了Buffer Pool里的缓存页,缓存页就会变成脏页,之所以说他是脏页,就是因为缓存页里的数据目前跟磁盘文件里的数据页的数据是不一样的,所以此时叫缓存页是脏页。

既然是脏页,那么就必然得有一个合适的时机要把那脏页给刷入到磁盘文件里去,之前我们其实就仔细分析过这个脏页刷入磁盘的机制,他是维护了一个lru链表来实现的,通过lru链表,他知道哪些缓存页是最近经常被使用的。

那么后续如果你要加载磁盘文件的数据页到buffer pool里去了,但是此时并没有空闲的缓存页了,此时就必须要把部分脏缓存页刷入到磁盘里去,此时就会根据lru链表找那些最近最少被访问的缓存页去刷入磁盘,如下图所示。

image-20230108194034076

那么万一要是你要执行的是一个查询语句,需要查询大量的数据到缓存页里去,此时就可能导致内存里大量的脏页需要淘汰出去刷入磁盘上,才能腾出足够的内存空间来执行这条查询语句。

在这种情况下,可能你会发现突然莫名其妙的线上数据库执行某个查询语句就一下子性能出现抖动,平时只要几十毫秒的查询语句,这次一下子要几秒都有可能,毕竟你要等待大量脏页flush到磁盘,然后语句才能执行!

另外还有一种脏页刷磁盘的契机,之前我们并没有给大家提到,就是大家都知道redo log buffer里的redo log本身也是会随着各种条件刷入磁盘上的日志文件的,比如redo log buffer里的数据超过容量的一定比例了,或者是事务提交的时候,都会强制buffer里的redo log刷入磁盘上的日志文件。

然后我们也知道,磁盘上是有多个日志文件的,他会依次不停的写,如果所有日志文件都写满了,此时会重新回到第一个日志文件再次写入,这些日志文件是不停的循环写入的,所以其实在日志文件都被写满的情况下,也会触发一次脏页的刷新。

为什么呢?因为假设你的第一个日志文件的一些redo log对应的内存里的缓存页的数据都没被刷新到磁盘上的数据页里去,那么我问你,一旦你把第一个日志文件里的这部分redo log覆盖写了别的日志,那么此时万一你数据库崩溃,是不是有些你之前更新过的数据就彻底丢失了?

所以一旦你把所有日志文件写满了,此时重新从第一个日志文件开始写的时候,他会判断一下,如果要是你第一个日志文件里的一些redo log对应之前更新过的缓存页,迄今为止都没刷入磁盘,那么此时必然是要把 那些马上要被覆盖的redo log更新的缓存页都刷入磁盘的,如下图。

image-20230108194048640

尤其是在这一种刷脏页的情况下,因为redo log所有日志文件都写满了,此时会导致数据库直接hang死,无法处理任何更新请求,因为执行任何一个更新请求都必须要写redo log,此时你需要刷新一些脏页到磁盘,然后才能继续执行更新语句,把更新语句的redo log从第一个日志文件开始覆盖写。

所以此时假设你在执行大量的更新语句,可能你突然发现线上数据库莫名其妙的很多更新语句短时间内性能都抖动了,可能很多更新语句平时就几毫秒就执行好了,这次要等待1秒才能执行完毕。

因此遇到这种情况,你必须要等待第一个日志文件里部分redo log对应的脏页都刷入磁盘了,才能继续执行更新语句,此时必然会导致更新语句的性能很差。

所以综上所述,导致线上数据库的查询和更新语句莫名其妙出现性能抖动,其实就很可能是上述两种情况导致的执行语句时大量脏缓存页刷入磁盘,你要等待他们刷完磁盘才能继续执行导致的。

下一次我们继续讲解,针对上述两种情况的数据库性能抖动,应该如何来优化数据库的参数配置,来解决上述的性能问题。

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

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

相关文章

黑客入门破解网络密码常用的九个方法!

个人网络密码安全是整个网络安全的一个重要环节,如果个人密码遭到黑客破解,将引起非常严重的后果。比如,银行卡账户密码被盗,你就给别人打工了。所以,增强网民的网络安全意识是网络普及进程的一个重要环节。 常言道&am…

ThreadPoolExecutor执行流程和拒绝策略

【面试常考】 之前我们讲到的多线程案例里面的Executors 本质上是 ThreadPoolExecutor 类的封装. ThreadPoolExecutor 提供了更多的可选参数, 可以进一步细化线程池行为的设定. 什么是ThreadPoolExcutor类? 首先通过文档我们看看ThreadPoolExcutor提供给我们的构造…

超详细彻底卸载Anaconda详细教程

一、在开始出打开Anaconda Prompt 二、打开后,输入conda install tqdm -f命令并按回车键 conda install tqdm -f三、之后页面会出现一个WANNING,这个我们不用在意,之后会出现一个y/n提示框,在这里我们输入y或者Y y四、输入con…

小程序容器与微服务架构的关系

随着移动互联网的发展,小程序已经成为了一种非常流行的应用方式,它可以在不安装任何应用的情况下,直接在移动终端设备(如:App,iPad等)中运行。微服务架构则是一种的分布式系统架构,可…

SpringBoot整合MybatisPlus多数据源

相信在很多使用MybatisPlus框架的小伙伴都会遇到多数据源的配置问题,并且官网也给出了推荐使用多数据源 (dynamic-datasource-spring-boot-starter) 组件来实现。由于最近项目也在使用这个组件来实现多数据源切换,因此想了解一下该组件是如何运行的&…

以太网协议和DNS

目录 🐕今日良言:跨过困难,去迎接更好的自己. 🐳一、以太网桢格式 🐳二、DNS 🐕今日良言:跨过困难,去迎接更好的自己. 🐳一、以太网桢格式 数据链路层考虑的是相邻两个节点(通过网线/光纤/无线直接相连的两个设备…

有趣的表盘布局环绕动画

前言 C端的介绍页中,设计师设计动画特效都非常有意思。这次遇到了“表盘内容元素环绕效果”,类似于表盘中的分针在一格一格运动一样,只是这次动画运动的元素不一样。 效果如下: 实现表盘布局 合理的运用JavaScrip的三角函数&am…

Malware Dev 01 - 免杀之 PPID Spoofing 原理解析

写在最前 如果你是信息安全爱好者,如果你想考一些证书来提升自己的能力,那么欢迎大家来我的 Discord 频道 Northern Bay。邀请链接在这里: https://discord.gg/9XvvuFq9Wb我会提供备考过程中尽可能多的帮助,并分享学习和实践过程…

第十五天笔记

1. 编程实现计算2023-2-1到2023-3-1相隔多少天? from datetime import datetimestart_date_str "2023-2-1"end_date_str "2023-3-1"start_date datetime.strptime(start_date_str, "%Y-%m-%d")end_date datetime.strptime(end_d…

pmp项目管理考完有什么好处?

作为曾经5A(现在改3A了)通过考试的老学姐说下经验 做好规划 一定要合理安排自己预习、复习和做题的时间,提前规划。其中不要小看课前预习这件事,带着问题去上课,绝对能事半功倍。同时也能及时知道老师到底在讲解哪个知…

网络安全入门:不可不知的8款免费Web安全测试工具

随着 Web 应用越来越广泛,Web 安全威胁日益凸显。黑客利用网站操作系统的漏洞和 Web服务程序的 SQL 注入漏洞等得到Web服务器的控制权限,轻则篡改网页内容,重则窃取重要内部数据,更为严重的则是在网页中植入恶意代码,使…

互联网时代,学什么专业就业好?

互联网时代的手机、智能电视、家具、机械设备等各种有形产品都将会嵌入智能芯片,都会有嵌入式软件或App与之相连,从而形成智能产品。这是我们开启智能化硬件的开始,在这样的环境下,如果要问学什么就业最好?当然首选Jav…

串口、终端应用程序 API termios

UART简介 串口全称为串行接口,也称为COM接口,串行接口指的是比特一位位顺序传输,通信线路简单。使用两根线就可以实现双向通信,一条为TX,一个为RX。串口通信距离远,但速度相对慢,是一种常用的工…

软测入门(二)测试用例、自动化测试理念

测试用例(test case) 特性 有效性:测试用例能够被使用,且被不同的人员使用测试结果一致可复用性:如回归测试的使用可评估性可管理性 八大要素 测试编码:方便归档和查询测试模块/功能预置条件&#xff1a…

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

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

操作系统发展历程

手工操作阶段(此阶段无操作系统) 用户在计算机上算题的所有工作都要人工干预。该阶段有两个突出缺点: 用户独占全机,虽然不会出现因资源已被其他用户占用而等待的现象,但资源利用率低。 CPU等待手工操作,CPU的利用不充分 唯一的…

【虚拟机搭建】win11搭建虚拟机两种方式:【virtualbox+vagrant】【VMware】(附centos系统、附安装包)

描述 本教程windows系统搭建虚拟机方式,主要包含两种方式,分别是:【vagrantvirtualbox】和【VMware】推荐大家使用【vagrantvirtualbox】方式进行安装,也可根据自己喜好进行选择本教程安装包 包含三种下载方式,分别是…

关于Could not build wheels for opencv-python-headless, which is...报错的解决方案

在通过最新版pip在线安装package:opencv-python-headless的时候,会产生报错信息,主要为 ERROR: Failed building wheel for opencv-python-headless ERROR: Could not build wheels for opencv-python-headless, which is required to insta…

Active Directory(活动目录)用户登录管理

活动目录用户登录管理 ADManager Plus 通过其预定义的用户登录报告简化了跟踪,监控和整合Active Directory用户登录特定数据的艰巨任务。Active Directory用户登录特定信息,如登录时间,登录历史记录,登录尝试,用户登录…

【钓鱼实测】写bug给new bing和chatGPT查。问他们林黛玉倒拔垂杨柳

BUG 错误代码 #include <iostream> #include <vector> using namespace std; int main() {vector<int> vec{1,2,3,2,4};for (auto iter vec.begin(); iter ! vec.end(); iter ){if (*iter 2) {vec.erase(iter);}}cout << vec.size() << endl…