你真的知道如何设置数据库连接池的大小吗 (2)

查询当前数据库已建立连接数:

mysql> show status like 'Threads_connected'; +-------------------+-------+ | Variable_name | Value | +-------------------+-------+ | Threads_connected | 89 | +-------------------+-------+ 1 row in set (0.00 sec)

Mysql的配置可以在全局变量中查询和设置,相关的配置主要可以查询下面这些:

配置 含义
Connections   尝试连接Mysql的连接数,不管连接成功与否,该值都会+1  
Threads_connected   已经建立的连接数,单节点下一般小于最大连接池最大连接数  
max_connections   Mysql限制的最大的可连接的数量  
wait_timeout   即MYSQL长连接(非交互式)的最大生命时长,默认是8小时  
interactive_timeout   长连接(交互式)的最大生命时长,默认是8小时  
3. 连接池设置多少连接才合适

设置连接池的大小肯定不是越大越好,需要考虑的是当前服务所在机器的性能,网络状况,数据库机器性能,数据库特性等等。同时也要做到不浪费系统资源,内存,端口,同步信号量等等。

比如说应用服务器Tomcat设置的最大线程池缺省值200,最大假设每个线程会用到一个数据库连接,那么线程池大小应该小于等于200。

另外需要考虑的是,每申请一个长连接都会在物理网络上建立一个用于长连接维护的进程,而进程的执行跟物理机的CPU核数有关。理论上一个8核的服务器将连接池设置为8最佳,每一个核同时处理一个线程,超过8的并发就有线程上下文切换的开销。

这里有一个 Oracle 性能小组发布的简短视频,连接池测试分2个部分:测试视频1 ,测试视频2 。视频中调整了线程池大小为2048的时候数据库性能陡然下降,后面调整到144就恢复了。PostgreSQL提供了一个设置预期线程池大小的公式:

connections = ((core_count * 2) + effective_spindle_count)

该公式来自于:https://github.com/brettwooldridge/HikariCP/wiki/About-Pool-Sizing。

其中,core_count是CPU核心, effective_spindle_count 的含义是有效主轴数,如果你的服务器使用的是带有16个磁盘的RAID,那么valid_spindle_count=16。它实质上是服务器可以管理多少个并行I / O请求的度量。旋转硬盘一次(通常)一次只能处理一个I / O请求,如果你有16个,则系统可以同时处理16个I / O请求。

我想 Hikari 作为目前最优秀的数据库连接池之一,提出的这个公式还是经得起检验的。大家不妨在生产环境试试(出问题别找我)。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zysjfx.html