一次Mysql数据库活跃连接数高告警的排查方法

devtools/2024/10/20 18:59:07/

基础相关知识

在现代应用中,数据库的性能和稳定性直接影响到整个系统的运行情况。活跃连接数高的告警往往意味着数据库负载过重,可能会导致性能下降甚至服务不可用。

活跃连接数指的是当前与数据库建立连接并且处于活动状态的连接数量

高活跃连接数可能由以下原因引起:

  • 应用程序连接池配置不当
  • 数据库查询效率低下
  • 未释放的连接或连接泄漏
  • 短时间内的并发请求激增

背景

Apollo 是一个开源的分布式配置管理系统,由携程开发并维护。它旨在为微服务架构提供灵活、可管理的配置解决方案,支持动态配置更新、版本控制和多环境管理。存储方面主要是依赖于mysql数据库。在系统运行了一段时间后,某天出现了DBA同事发过来的“活跃连接数”高的告警。随着活跃连接数高的问题触发,发现此时整个DB系统的处理能力都会直线下降,sql执行耗时大大增加。

排查思路

1、由于Apollo最近一段时间系统都没发生过迭代升级,看应用层面的监控数据也没有明显看出指标异常,故怀疑是DB层面可能出现的性能问题。

2、查看DB的监控报表,发现CURD的指标也没有异常的波峰波谷。发现的情况主要表现为:

a、活跃连接数偶尔飙高,但是持续的时间不长,大概几秒就处理OK

b、mysql cpu使用率飙高

c、DB机器的io偶尔飙高

d、获取行锁的次数和时间都多

3、和DBA同事一起排查,DBA同事认为目前ioutil的值在可控范围内,看DB机器的负载也不高,DB机器近期都没变动过,初步排除是数据库层面引起导致的问题。初步怀疑是update引起的并发高导致的问题,因为系统中有个update的探活请求,大概qps为200左右。由于这条SQL update的key是同一个,所以这里存在可疑性,就是产生并发锁的问题。但这也很难解释为啥跑了那么久才会出现这个问题,因为最近一直qps都是一样的,所以这个理由也不够让人信服。。。

4、故不是DB层面的问题,那极大概率还是程序层面导致出现的性能问题。排查程序,发现在内部的一个定期60秒更新配置的一个逻辑里面,存在一个扫描全表加载数据到内存中的逻辑。此时快速想到,极大可能是这个表的数据量增长了,导致扫描查询次数增多,最终导致瞬时QPS高导致活跃连接数飙高的原因。查询数据库,发现表的数据量确实涨了2倍。

5、修正表的无效数据表的数据量降下来后,观察grafana报表,活跃连接数再也没出现飙高现象,mysql的cpu使用率也降下来了,问题最终解决了。

总结

此次导致数据库出现活跃连接数高的原因,是瞬时的查询qps变高,由于查询的数据量多,继而导致mysql cpu使用率高,io也将面临压力,可能出现ioutil高的问题。这个问题排查的难点是,一开始不确定到底是数据库层面的问题导致的应用程序慢,还是应用程序慢导致的DB出现的性能瓶颈。


http://www.ppmy.cn/devtools/122214.html

相关文章

项目级别的配置文件 `.git/config`||全局配置文件 `~/.gitconfig`

Git 项目级别的配置文件 .git/config,该文件包含了当前项目(仓库)的特定配置。 与全局配置文件 ~/.gitconfig 不同,这里的设置仅对当前项目生效。 配置内容解释 [core]repositoryformatversion 0filemode truebare falselog…

WindowsTerminal中oh-my-posh样式的cmd、git-bash、cmder配置参数

C:\Users\root\Documents\WindowsPowerShell中写如下内容 Import-Module posh-git # 引入 posh-git Import-Module oh-my-posh # 引入 oh-my-posh Import-Module -Name Terminal-Icons # 引入文件图标库 Import-Module PSReadLine # 历史命令联想 # 设置主题 Set-PoshPrompt …

组件中$router/$route的由来(vue-router源码分析)

1.vue-router源码下载 我们可以到github上找到对应版本的vue-router 版本号可以到项目中的node_modules/vue-router/dist/vue-router.js查看嘴上面的许可证说明(package.json只提供了版本的大致范围 ^表示2.2.x 而~表示2.x.x 都为>的含义) 在github上的vue-router我们要选择…

Linux常用指令

Linux常用命令 查询进程 ps aux | grep 进程名称 端口监听 sudo netstat -tulnp | grep 9944 显卡 查询显卡信息 lspci | grep VGA 查看显卡详情 sudo lshw -C video 显卡使用情况 nvidia-smi nvtop 系统与功耗 硬件资源 top 整机功耗/用电瓦数 sudo apt-get insta…

【SpringBoot】基础+JSR303数据校验

目录 一、Spring Boot概要 1. SpringBoot介绍 2. SpringBoot优点 3. SpringBoot缺点 4. 时代背景-微服务 二、Spring Boot 核心配置 1. Spring Boot配置文件分类 1.1 application.properties 1.2 application.yml 1.3 小结 2. YAML概述 3. YAML基础语法 3.1 注意事…

【分页】Spring Boot 列表分页 + javaScript前台展示

后端: 准备好查询实体与分页实体 1、分页工具实体 package com.ruoyi.dms.config;import com.alibaba.nacos.api.model.v2.Result; import lombok.Data;import java.io.Serializable; import java.util.List;/*** author 宁兴星* description: 列表返回结果集*/ …

Windows系统编程(三)进程与线程二

进程与线程 进程:直观的说就是任务管理器中各种正在运行的程序。对于操作系统来说,进程仅仅是一个数据结构,并不会真实的执行代码 线程:通常被称作但并不真的是轻量级进程或实际工作中的进程,它会真实的执行代码。每…

Pytorch中不会自动传播梯度的操作有哪些?

在 PyTorch 中,某些生成张量的操作本身不会创建与计算图相关联的梯度信息。这些操作通常用于初始化张量,并且默认情况下不需要进行梯度计算。以下是一些常见的不会自动传播梯度的张量生成操作: 数值初始化操作: torch.linspace():…