记录一次服务响应接口变慢的问题
接口原来调用只需要不到1s中,这两天开始变成了10s左右。
问题描述:
mysql部署在a服务器,redis在b服务器,项目部署在a服务器。刚部署时接口调用响应都很快,但是在部署几个小时之后,调用查询mysql逻辑很简单的接口调用都变成十几秒,但是调用查redis的接口就没变,一样很快。其他部署在a服务器的项目都没有变卡。 在项目中用到了线程池,用在了两个定时任务。
1、调用其他接口响应速度,发现只要是查询数据库的接口都变慢很多了。查询在另一个服务器的redis接口速度不变。 (那么就是mysql服务器的问题)
2、在服务器查看cpu占用率 发现算法的三个服务有问题。 通知算法解决 linux命令 top
3、后面还是有这个问题查询慢sql、网络以及jvm:
在一个简单的查询接口业务逻辑层和控制层加入log日志时间 发现刚开始部署时mapper调用的方法在毫秒级别,在部署几个小时后mapper编程了好几秒
还有查看jvm gc的情况
网络是没问题的
初步判定是数据库连接池的问题 用的是德鲁伊 然后看了一下前同事写的定时任务 很多分钟级别的定时器采集阿里云数据 用了for循环一个设备一个设备的插入数据和更新数据
4、配置德鲁伊web监控页面
5、综上初步判定是服务数据库连接池的问题。
6、将定时任务中一个一个设备插入数据的方法该为in插入,批量插入,降低占用连接。 计划在公司以后的项目中,定时任务单独部署一个服务进行采集。
7、解决:将前同事的代码进行优化。在新服务器用docker重新部署一个mysql服务。接口变慢的问题就解决了,因为阿里云的数据库目前有好多个项目在使用,可能达到瓶颈。后面会更新mysql配置的博客。