关于xxl-job中的慢sql引发的磁盘I/O飙升导致拖垮整个数据库服务

news2024/11/20 15:22:32

背景:

某天突然发现服务探测接口疯狂告警、同时数据库CPU消耗也告警,最后系统都无法访问;

查看服务端日志,发现大量的报错如下:

CommunicationsException: Communications link failure :The last packet successfully received from the server was 201,106 milliseconds ago. The last packet sent successfully to the server was 200,106 milliseconds ago.

起先以为服务出现问题,服务重启后现象依旧。

调查:

通过iostat命令观察到cpu的iowait非常高,再加上服务端的日志报错也是和数据库相关的,然后就把怀疑的方向转移到Mysql是否存在慢SQL拖垮了整个服务。

最后查到是我们使用的xxl-job中间件的一个慢SQL阻塞了整个系统的资源

SELECT t.id
FROM xxl_job_log AS t
WHERE t.trigger_code = 200
AND t.handle_code = 0
AND t.trigger_time <= '2023-02-1 23:36:51.57'
AND t.executor_address NOT IN (
SELECT t2.registry_value
FROM xxl_job_registry AS t2
)

查询使用命令如下

1.查看哪些表被锁:show OPEN TABLES where In_use > 0;
2.查询正在执行的SQL,发现大量SQL执行阻塞了几百秒:
select * from information_schema.processlist where db=‘ db_xxx ‘ and info is not null;
3.直接取出索引的进程ID,拼装成kill语句,取出来执行,干掉阻塞中的索引进程:
select concat(‘kill ‘, id,‘;‘) from information_schema.processlist where db=‘db_xxx ‘ and info is not null;

经过在网上的查询也可以发现官方提出了类似的问题

https://gitee.com/xuxueli0323/xxl-job/issues/I57M1Y

https://github.com/xuxueli/xxl-job/issues/596

为什么数据库的慢SQL会导致CPU的IO WAIT升高呢

我们先看一下计算机是怎么管理磁盘IO操作的。计算机发展早期,磁盘和内存的数据传输是由CPU控制的,也就是说从磁盘读取数据到内存中,是需要CPU存储和转发的,期间CPU一直会被占用。我们知道磁盘的读写速度远远比不上CPU的运转速度。这样在传输数据时就会占用大量CPU资源,造成CPU资源严重浪费。

后来有人设计了一个IO控制器,专门控制磁盘IO。当发生磁盘和内存间的数据传输前,CPU会给IO控制器发送指令,让IO控制器负责数据传输操作,数据传输完IO控制器再通知CPU。因此,从磁盘读取数据到内存的过程就不再需要CPU参与了,CPU可以空出来处理其他事情,大大提高了CPU利用率。这个IO控制器就是“DMA”,即直接内存访问,Direct Memory Access。现在的计算机基本都采用这种DMA模式进行数据传输。

image.png

通过上面内容我们了解到,IO数据传输时,是不占用CPU的。当应用进程或线程发生IO等待时,CPU会及时释放相应的时间片资源并把时间片分配给其他进程或线程使用,从而使CPU资源得到充分利用。所以,假如CPU大部分消耗在IO等待(wa)上时,即便CPU空闲率(id)是0%,也并不意味着CPU资源完全耗尽了,如果有新的任务来了,CPU仍然有精力执行任务。如下图:

image.png

在DMA模式下执行IO操作是不占用CPU的,所以CPU IO等待(上图的wa)实际上属于CPU空闲率的一部分。所以我们执行top命令时,除了要关注CPU空闲率,CPU使用率(us,sy),还要关注IO Wait(wa)。注意,wa只代表磁盘IO Wait,不包括网络IO Wait。

因为CPU处理数据的速度远远大于IO准备数据的速度。所以再进行“读操作”时,DMA负责将数据从磁盘拷贝到内核空间,注意是拷贝不是移动,然后cpu再从内核空间拷贝到用户空间。所以,cpu等待io就绪,在“读操作”时,等的就是DMA将数据从磁盘拷贝到内核空间。

理论与实际结合

那么反应到我们遇到的这个场景就是:iowait是cpu处于空闲状态,因为服务端要做事情之前一般要查一下库如用户权限之类会查用户权限表,现在mysql那里索引出问题了,io资源全被阻塞住了,达到了磁盘IO的瓶颈,服务端这边又一直等待数据从磁盘拷贝到dma(那个问题SQL对应的表数据达到千万级别),磁盘的传输效率又很低所以要把所有的查询返回结果拷贝完非常的耗时,所以才会出现上面的SQL执行了几百秒还没有结束,而系统代码只有再获取到数据库的查询结果后,才能走下面的计算逻辑,那可不是cpu空闲着也没啥可做的,就只是傻乎乎地在等着io拷贝结束嘛,而那些问题SQL又一直占据着IO资源迟迟不释放,就导致了整个系统的不可用。
当把这些问题SQL kill掉之后,系统恢复正常,后面我们针对这个场景增加了一个定时任务来清理那些没用的记录。

后续如何避免MYSQL使用中的慢SQL导致CPU-IOWAIT偏高致使整个系统不可用

问题源头

CPU的消耗主要在 用户、系统、IO等待、软硬中断、空闲。

主要针对用户、IO等待进行优化(其他方面较难改变)

用户:  用户这块主要是用户空间CPU消耗,各种逻辑运算; 比如:正在进行大量tps

以及函数/排序/类型转化/逻辑IO访问…

IO等待:等待IO请求的完成

主要是这两者消耗了大部分的CPU,导致吞吐量下降、查询响应时间增加、慢查询增加。

减少CPU消耗

1.  减少等待

减少IO量:创建适合的索引,空间换时间,提示慢SQL的执行速度。

提升IO处理能力:加大cache、加大磁盘/SSD

2. 减少计算

1)  减少逻辑运算:

避免使用函数,将运算转移至易扩展的应用服务器中

如substr等字符运算,dateadd/datesub等日期运算,abs等数学函数

减少排序,利用索引取得有序数据或避免不必要排序

如union all代替 union,order by 索引字段等

禁止类型转换,使用合适类型并保证传入参数类型与数据库字段类型绝对一致

如数字用tiny/int/bigint等,必需转换的在传入数据库之前在应用中转好

简单类型,尽量避免复杂类型,降低由于复杂类型带来的附加运算。更小的数据类型占用更少的磁盘、内存、cpu缓存和cpu周期

2) 减少逻辑IO量:

index,优化索引,减少不必要的表扫描如增加索引,调整组合索引字段顺序,去除选择性很差的索引字段等等

table,合理拆分,适度冗余如将很少使用的大字段拆分到独立表,非常频繁的小字段冗余到“引用表”

SQL,调整SQL写法,充分利用现有索引,避免不必要的扫描,排序及其他操作如减少复杂join,减少order by,尽量union all,避免子查询等

数据类型,够用就好,减少不必要使用大字段如tinyint够用就别总是int,int够用也别老bigint,date够用也别总是timestamp

减少query请求量

适当缓存,降低缓存数据粒度,对静态并被频繁请求的数据进行适当的缓存如用户信息,商品信息等

优化实现,尽量去除不必要的重复请求如禁止同一页面多次重复请求相同数据的问题,通过跨页面参数传递减少访问等

合理需求,评估需求产出比,对产出比极端底下的需求合理去除

 3. 升级cpu

若经过减少计算和减少等待后还不能满足需求,cpu利用率还高,使用杀手锏升级cpu(使用更快更多的CPU)

相关文章:

关于job-admin 拖垮数据库

xxl job 运行性能问题

The last packet successfully received from the server was xx milliseconds ago

I/O多路复用

MySQL优化5之CPU消耗过高

io等待为什么引发cpu过高

一次I/O问题引发的P0重大故障

本篇文章如有帮助到您,请给「翎野君」点个赞,感谢您的支持。

首发链接:https://www.cnblogs.com/lingyejun/p/17081210.html

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

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

相关文章

dapr入门与本地托管模式尝试

1 简介 Dapr是一个可移植的、事件驱动的运行时&#xff0c;它使任何开发人员能够轻松构建出弹性的、无状态和有状态的应用程序&#xff0c;并可运行在云平台或边缘计算中&#xff0c;它同时也支持多种编程语言和开发框架。Dapr支持的语言很多&#xff0c;包括C/Go/Java/JavaSc…

antv/x6 2.x 搭建流程图编辑页面(1)

进来闲来无事&#xff0c;看到x6 2.x版本也更新了有几个月了&#xff0c;便想着熟悉下2.x版本 一、首先搭建项目基础框架。 // yarn 方式 yarn create vitejs/app v3-ts --template vue-ts cd v3-ts yarn yarn dev// npm npm init vitejs/app v3-ts --template vue-ts cd v3…

人工神经网络BP神经网络结构及优化原理单隐层,多隐层及反向传播梯度下降释义

神经网络&#xff1a;人工神经网络&#xff08;Artificial Neural Networks&#xff0c;简写为ANNs&#xff09;也简称为神经网络&#xff08;NNs&#xff09;或称作连接模型&#xff08;Connection Model&#xff09;&#xff0c;它是一种模仿动物神经网络行为特征&#xff0c…

ASEMI整流模块MDA110-16参数,MDA110-16规格

编辑-Z ASEMI整流模块MDA110-16参数&#xff1a; 型号&#xff1a;MDA110-16 最大重复峰值反向电压&#xff08;VRRM&#xff09;&#xff1a;1600V 最大RMS电桥输入电压&#xff08;VRMS&#xff09;&#xff1a;1700V 最大平均正向整流输出电流&#xff08;IF&#xff0…

多线程synchronized对象锁与静态锁之间的8锁问题理解

目录8锁问题锁1&#xff1a;多个线程使用同一对象分别调用不同带有带synchronized关键字且非静态的方法锁2&#xff1a;在锁1基础上&#xff0c;增加A线程执行的方法的执行时间&#xff0c;使得B有机会参与执行锁3&#xff1a;多个线程使用同一对象&#xff0c;一个线程执行带有…

三菱Q系列QJ71C24N模块 MODBUS通信(含完整步骤+源代码)

MODBUS通信的其它相关基础知识请参看下面的文章链接: SMART S7-200PLC MODBUS通信_RXXW_Dor的博客-CSDN博客MODBUS 是 OSI 模型第 7 层上的应用层报文传输协议,它在连接至不同类型总线或网络的设备之间提供客户机/服务器通信。自从 1979 年出现工业串行链路的事实标准以来,…

7z压缩包有可能被破解吗,需要多久,暴力穷举和字典破解分别的速度分析

开门见山&#xff0c;我看到网上有很多此类软件&#xff0c;功能就是来破解7zip格式的压缩包&#xff0c;但都没有认真进行测试&#xff0c;这里认真进行判断和测试 首先&#xff0c;目前世界最快的计算机为Frontier&#xff0c;算力1,685.65 PFlop/s。目前最高的算力为全网比…

【IoT】智能小产品:简易电子琴设计

说明 随着电子技术的发展&#xff0c;电子技术正在逐渐改善着人们的学习、生活、工作&#xff0c;因此开发本系统希望能够给人们多带来一点生活上的乐趣&#xff0c;电子技术与音乐的结合不断加深。 由此而产生的电子琴在这种形势下&#xff0c;因其体积小&#xff0c;易于携…

芯科EFRBG22C112 empty工程创建

目录 1.使用工具 2.创建工程 2.1进入welcome,选择芯片&#xff0c;点击start ​编辑 2.2选择sdk4.2.0版本 2.3点击Create New Project 2.4同步步骤创建引导程序bootloader-apploader 3.遇到问题 1.使用工具 ARM仿真器 EFR32BG22C112芯片开发板 pc 使用ARM仿真器连接BG22…

PMP考试多少分算通过?

PMP 是没有具体分数的&#xff0c;只有等级&#xff0c; PASS 就是通过了这张成绩单就是 PASS&#xff0c;3A。主要看头部这里&#xff0c;PASS 就是通过了&#xff0c;FAIL 就是没通过。至于说的 3A&#xff0c;2A1T 啥的&#xff0c;是对应的每个模块的成绩&#xff0c;PMP 的…

【leetcode - 基础】编程能力( 4 / 20天 )

目录 Day - 1 896. 单调数列 - 简单ac 28. 找出字符串中第一个匹配项的下标 - KMP 1、kmp模板 2、java api Day - 2 110. 平衡二叉树 - 递归 1、自顶向下 - 暴力 459. 重复的子字符串 - 暴力 Day - 3 150. 逆波兰表达式求值 - 栈 后缀表达式 66.加一 - 模拟 Day…

Tensorflow 基础与实战

目录 一、线性回归实现 1.1 数据加载与查看绘图 1.2 模型建立、训练与预测 二、神经网络实现 2.1 数据加载与查看绘图 2.2 模型建立、训练与预测 三、逻辑回归实现 3.1 数据加载与查看绘图 3.2 模型建立、训练与预测 四、softmax分类 4.1 数据加载 4.2 数据归一化 …

ReadyAPI x64bit 3.43.0 Crack

ReadyAPI 允许团队在一个集中的界面中创建、管理和执行自动化的功能、安全和性能测试——为敏捷和 DevOps 软件团队提高 API 质量。 ReadyAPI 在单一平台上提供三个模块&#xff1a; 在ReadyAPI 测试模块中&#xff0c;您创建功能测试以验证您的服务是否按预期工作。您可以使用…

高频数组算法

1.二分查找 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff0c;否则返回 -1。 示例 1: 输入: nums [-1,0,3,5,9,12], target 9 输…

程序员的职业生涯个人规划(附上学习资料)

目录 前言 1.程序员的规划 2.程序员的进化路径 3.IT行业的难度 4.你的选择 5.再谈谈资本、工具人和内卷 总结&#xff1a; 前言 今天不讲技术也不讲干货&#xff0c;来聊一聊程序员职业生涯的个人规划。希望对不管是想入门的还是已经在这条路上的朋友能有一个帮助。 1.程…

opencv之直方图绘制及均衡化

直方图均衡化优势&#xff1a;增强图像对比度&#xff0c;使对比度较低的局部区域获得高对比度。当图像非常暗或者非常亮&#xff0c;并且背景和前景之间的差异非常小时&#xff0c;此方法非常有效&#xff0c;能够解决暴露过度或暴露不足的问题。直方图均衡化缺陷&#xff1a;…

多彩的书写工具,画图写字更好看,米家液晶小黑板多彩版上手

平时临时记些信息&#xff0c;或者是教小朋友认字的时候&#xff0c;液晶小黑板都是特别实用的工具&#xff0c;我之前就用过米家液晶小黑板&#xff0c;最近我发现米家新出了一款彩色笔迹的小黑板&#xff0c;书写效果更加好看&#xff0c;比以前单色款的更好用。 这款米家液晶…

【技术分享】MA21日均线交易策略

文章目录1.前言1.1.相关术语1.2.MA均线系统设置分类1.3.斐波那契数列2.MA21日均线2.1.MA21日均线2.2.MA21日均线交易策略2.3.MA21日均线案例分析1.前言 1.1.相关术语 空头市场&#xff08;Bear Market&#xff09;&#xff1a;亦称熊市&#xff0c;指价格长期呈 下跌 趋势的证…

操作系统权限提升(十)之系统错误配置-计划任务提权

系列文章 操作系统权限提升(一)之操作系统权限介绍 操作系统权限提升(二)之常见提权的环境介绍 操作系统权限提升(三)之Windows系统内核溢出漏洞提权 操作系统权限提升(四)之系统错误配置-Tusted Service Paths提权 操作系统权限提升(五)之系统错误配置-PATH环境变量提权 操作…

VUE3.0学习

一、父子传值 父组件向子组件传值和vue2.0相比区别不大&#xff0c;区别在于api的使用&#xff0c;让接收参数的写法多样化。父组件::::: <template><div class"about"><div><main><TheWelcome :info"parMsg"/></main>…