误区:数据库连接池设置的越大,性能越高,吞吐量越大。
错错错。
为啥呢?? 【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
当然公式不是万能的啦,也要根据具体场景具体分析,例如:
如果系统中混合了长事务和短事务,那么,可以创建两个连接池,一个服务于长事务,一个服务于短事务。
或者说,业务要求同一时间内只执行一定数量的任务,那么并发任务数就应该去适配连接池连接数。