20190710 - 数据库连接池大小如何设置

误区:数据库连接池设置的越大,性能越高,吞吐量越大。
错错错。

为啥呢?? 【CPU + 磁盘I/O + 网络I/O】
主要原因:
【CPU】:因为单核CPU的计算机,运行数百个线程,也是CPU去快速调度,切换,执行,使它看起来并行,但其实并不是哒。而且一旦线程的数量超过了CPU核心的数量,再加线程,系统只会更慢,因为上下文切换很耗费额外性能。如果说不考虑其他因素,那么服务器是几核,数据库的连接数就设置成几就能提供最优性能。
其他原因:
【磁盘I/O】:磁盘是由旋转的金属碟片和装在步进马达上的读写头组成的,要数据,就得先寻址。所以,磁盘的操作就会带来寻址的耗时和旋转的耗时,毕竟你要旋转到位才能操作,在这过程中,线程都是阻塞等待状态的,那么其实CPU可以服务于其他的线程。所以说,如果线程处理的是I/O密集型的业务,就可以设置的比CPU核心稍微大一点,这样就可以充分利用空闲时间完成更多的工作,如果是SSD固态硬盘,不需要寻址和旋转,减少线程阻塞的时间,那么更接近于CPU核心数会发挥出更高的性能。
【网络I/O】:网络带宽越高,线程阻塞可能性越小,那么线程数量越接近CPU核心数越好。

连接数计算公式

连接数 = ((核心数 * 2) + 有效磁盘数) (PostgreSQL 提供)
如果服务器CPU是四核i7的,那么连接数的大小为:(4*2)+1 = 9

当然公式不是万能的啦,也要根据具体场景具体分析,例如:
如果系统中混合了长事务和短事务,那么,可以创建两个连接池,一个服务于长事务,一个服务于短事务。
或者说,业务要求同一时间内只执行一定数量的任务,那么并发任务数就应该去适配连接池连接数。

参考链接:https://mp.weixin.qq.com/s?__biz=Mzg2MzE5MjMxNQ==&mid=2247489376&idx=1&sn=0b33a6e05909366cb984452c509b6603&chksm=ce7d02f4f90a8be259b546dc1d355f5eb2cef612fa34886447dff21990060fab6fe2097e01dd&mpshare=1&scene=1&srcid=&rd2werd=1#wechat_redirect

原创文章 88 获赞 21 访问量 3万+

猜你喜欢

转载自blog.csdn.net/cfy1024/article/details/95332514