近期写的一个项目中,MySQL连接池配置对性能的影响
一、遇到的问题
这几天在做一个框架时,遇到了一个棘手的问题:每当压测请求稍微大点,系统吞吐量死活上不去,Jmeter压测结果始终卡在五百多六百多QPS。
最奇怪的是——数据库服务器的CPU和内存明明占用不多==
二、怎么找到问题源头
想了下如果cpu跟内存都很空,那么有可能是mysql连接的问题,因为最近在做的这个项目需要频繁读写数据库…
用Arthas看线程在干嘛
1 | # 查看最忙的5个线程 |
结果发现大量线程卡在getConnection()
方法上,状态都是WAITING
。
压测时活跃连接数达到20,那么此时的想法就是去加大连接池的最大连接数了。
三、调优过程
关键配置调整(application.yml)
1 | spring: |
为什么是这些值?
- max-active=100:
网上有个公式:建议最大连接数 = (核心数 * 2) + 有效磁盘数
但是我是一点点试的==,50、100、200,发现到一百后差距不大,看阿里巴巴的文章分享好像有的直接开到2000 - max-wait=2000ms:
请求最大的等待时间 - min-idle=20:
连接池常驻连接
四、效果对比
指标 | 调优前 | 调优后 |
---|---|---|
QPS | 500+ | 2100+ |
平均响应时间 | 1800ms | 300ms |
五、一些坑
坑1:mysql服务器要同步设置连接数
有次我把max-active调到200,结果MySQL出现Too many connections
错误。后来发现MySQL数据库的max_connections默认是151,需要同步调整:
1 | SET GLOBAL max_connections = 200; -- 生产环境要持久化配置 |
- Title: 近期写的一个项目中,MySQL连接池配置对性能的影响
- Author: 自牧
- Created at : 2025-02-18 10:35:41
- Updated at : 2025-04-26 18:57:53
- Link: https://www.zimucode.top/2025/02/18/从500+到2000+QPS:MySQL连接池对性能的影响还是蛮大的/
- License: This work is licensed under CC BY-NC-SA 4.0.
Comments