近期写的一个项目中,MySQL连接池配置对性能的影响

自牧 Lv2

一、遇到的问题

这几天在做一个框架时,遇到了一个棘手的问题:每当压测请求稍微大点,系统吞吐量死活上不去,Jmeter压测结果始终卡在五百多六百多QPS。

最奇怪的是——数据库服务器的CPU和内存明明占用不多==


二、怎么找到问题源头

想了下如果cpu跟内存都很空,那么有可能是mysql连接的问题,因为最近在做的这个项目需要频繁读写数据库…

用Arthas看线程在干嘛

1
2
3
4
# 查看最忙的5个线程
thread -n 5
# 查看活跃连接数
watch com.alibaba.druid.pool.DruidDataSource getActiveCount

结果发现大量线程卡在getConnection()方法上,状态都是WAITING

压测时活跃连接数达到20,那么此时的想法就是去加大连接池的最大连接数了。


三、调优过程

关键配置调整(application.yml)

1
2
3
4
5
6
spring:
datasource:
druid:
max-active: 100 # 从20→100,开100个窗口
max-wait: 2000 # 排队时间从1秒→2秒
min-idle: 20 # 保持20个常开窗口

为什么是这些值?

  1. max-active=100
    网上有个公式:建议最大连接数 = (核心数 * 2) + 有效磁盘数
    但是我是一点点试的==,50、100、200,发现到一百后差距不大,看阿里巴巴的文章分享好像有的直接开到2000
  2. max-wait=2000ms
    请求最大的等待时间
  3. 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