当前位置:网站首页>任何代码未动的情况下第二天项目访问速度明显下降,案例分析
任何代码未动的情况下第二天项目访问速度明显下降,案例分析
2022-06-23 15:03:00 【惊天神猿】
一、案例实际情况
1.项目基本业务
一个大型的建筑性物流平台以及投标竞标的管理平台。
2.项目基本应用技术
前后端分离,前端框架vue后端框架Springcloud、数据库MySQL、容器k8s。
3.事故描述
前一天项目还正常访问用户还正常使用,结果第二天页面数据刷不出来,好多接口请求超时。排除了人为发布项目造成的代码bug之外,也排除了运维操作失误所造成的事故之外,一头雾水。
二、事故处理过程
1.跟踪代码
一般情况下,出了问题首先要直接跟踪代码分析具体的原因,加断点一步一步分析哪块慢了。结果就分析出sql执行非常耗时。
2.优化sql
发现sql已再无优化,索引该加的都加了,而且sql并不复杂。sql执行速度非常不稳定,有时快有时很慢。
3.查询数据库状态
1)查询数据库连接数:show processlist;

发现sleep连接非常多,导致我们程序代码占用数据库连接内存很少,执行sql非常慢。
2)查询最大连接数:show variables like '%max_connection%';

3)设置最大连接数:set global max_connections=1000;
虽然连接数设置多了,但是sleep连接还是太多,占用了数据库的很大内存空间,sql执行速度还是很慢,所以只能清除sleep连接。
4)清除连接
- 重启mysql服务连接数自然就清除了,但是不到非不得已建议不要重启mysql服务。
- set global wait_timeout=100 任何sleep连接睡眠时间若超过100秒,将会被mysql服务自然终止。
4.分析造成原因
以上虽然清除了mysql的sleep超长连接等待,解决了项目的执行sql慢的问题。到底是什么造成的,以后还会不会再发生,是个值得思考的问题。
数据库连接多了,并且出问题了,那肯定是项目数据库配置出问题了。
1)查看原先的配置

这里列一下数据库配置所代表的意思
name:表示你的连接池的名称也就是你要访问连接池的地址
auth:是连接池管理权属性,Container表示容器管理
type:是对象的类型
driverClassName:是数据库驱动的名称
url:是数据库的地址
username:是登陆数据库的用户名
password:是登陆数据库的密码
maxIdle:最大空闲数,数据库连接的最大空闲时间。超过空闲时间,数据库连
接将被标记为不可用,然后被释放。设为0表示无限制。MaxActive,连接池的最大数据库连接数。设为0表示无限制。
maxWait ,最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示
无限制。timeBetweenEvictionRunsMillis 动态检索时长,也就是我多久检查一下连接状况。
minEvictableIdleTimeMillis:设置多久未使用的连接将其释放掉。
validationQuery:用来检测连接是否有效的sql,要求是一个查询语句。
如果validationQuery为null,testOnBorrow、testOnReturn、
testWhileIdle都不会其作用。testWhileIdle:建议配置为true,不影响性能,并且保证安全性。
申请连接的时候检测,如果空闲时间大于
timeBetweenEvictionRunsMillis,
执行validationQuery检测连接是否有效。testOnBorrow:申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
testOnReturn:归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
poolPreparedStatements:是否缓存preparedStatement,也就是PSCache。
PSCache对支持游标的数据库性能提升巨大,比如说oracle。
在mysql5.5以下的版本中没有PSCache功能,建议关闭掉。
作者在5.5版本中使用PSCache,通过监控界面发现PSCache有缓存命中率记录,
该应该是支持PSCache。maxPoolPreparedStatementPerConnectionSize:指定每个连接上PSCache的大小。
filters:属性类型是字符串,通过别名的方式配置扩展插件,
常用的插件有:
监控统计用的filter:stat
日志用的filter:log4j
防御sql注入的filter:wallconnectionProperties:通过connectProperties属性来打开mergeSql功能;慢SQL记录
2)分析导致mysql的sleep连接过多原因
我们这使用的是alibaba的数据库连接包,而我们的数据库配置是springBoot原始的配置,也就是说没生效。timeBetweenEvictionRunsMillis、minEvictableIdleTimeMillis 配置没生效,60s检测时间超过300s的无效连接,并且释放。
3)阿里巴巴数据库连接包的正确配置方式
三、总结及处理结果
mysql执行速度降低是因为我们的无效连接过多,占用了mysql资源。造成的原因是因为我们的数据库配置没有生效,错误的配置导致了太多无效的数据库连接。解决的办法就是把数据库无效连接清除掉,重启mysql服务或者设置连接最大时长set global wait_timeout=500。然后将项目的数据库连接配置正确,主要是timeBetweenEvictionRunsMillis、minEvictableIdleTimeMillis 。
边栏推荐
- 力扣解法匯總513-找樹左下角的值
- Shandong: food "hidden money", consumption "sweeping monk"
- C. Phoenix and Towers-Codeforces Global Round 14
- [pyside2] pyside2 window is on the top of Maya (note)
- Xampp中mysql无法启动问题的解决方法
- JS traversal array (using the foreach () method)
- The idea and method of MySQL master-slave only synchronizing some libraries or tables
- 32. compose beautiful touch animation
- Gartner最新报告:低代码应用开发平台在国内的发展
- Une compréhension simple du tri rapide
猜你喜欢

《墨者学院——SQL手工注入漏洞测试(MySQL数据库)》

Gartner最新报告:低代码应用开发平台在国内的发展

Six programming insights in these five years!

12 BeautifulSoup类的初始化

Starting from 3, add paging function in the business system

Shandong: food "hidden money", consumption "sweeping monk"

Moher College - manual SQL injection vulnerability test (MySQL database)

SQL窗口函数怎么使用

自监督学习(SSL)Self-Supervised Learning

嵌入式软件架构设计-程序分层
随机推荐
golang 重要知识:mutex
How to solve the problem that iterative semi supervised training is difficult to implement in ASR training? RTC dev Meetup
这五年的6个编程感悟!
JS traversal array (using the foreach () method)
Xampp中mysql无法启动问题的解决方法
C. Add One--Divide by Zero 2021 and Codeforces Round #714 (Div. 2)
PHP specified fields are more than 100 in positive order and less than 100 in random order
[opencv450] salt and pepper noise demo
Force deduction solution summary 513- find the value of the lower left corner of the tree
进销存软件排行榜前十名!
【云驻共创】制造业企业如何建设“条码工厂”
JS创建一个数组(字面量)
How is it safe to open an account for futures? Which futures company has a relatively low handling fee for futures and is suitable for retail investors to open an account?
F5《2022年应用策略现状报告》:边缘部署及负载安全成亚太地区关注焦点
Raspberry PI installing the wiring pi
Top 10 purchase, sales and inventory software rankings!
The work and development steps that must be done in the early stage of the development of the source code of the live broadcasting room
云上探“店”,云商店全新升级!
The running rabbit fell
[pyside2] pyside2 window is on the top of Maya (note)