基础相关知识
在现代应用中,数据库的性能和稳定性直接影响到整个系统的运行情况。活跃连接数高的告警往往意味着数据库负载过重,可能会导致性能下降甚至服务不可用。
活跃连接数指的是当前与数据库建立连接并且处于活动状态的连接数量。
高活跃连接数可能由以下原因引起:
- 应用程序连接池配置不当
- 数据库查询效率低下
- 未释放的连接或连接泄漏
- 短时间内的并发请求激增
背景
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出现的性能瓶颈。