数据库连接池大小

一颗CPU核心同一时刻只能执行一个线程,然后操作系统切换上下文,核心开始执行另一个线程的代码。给定一颗CPU核心,其顺序执行A和B永远比通过时间分片“同时”执行A和B要快。一旦线程的数量超过了CPU核心的数量,再增加线程数系统只会更慢,而不是更快。

连接数 = ((核心数 * 2) + 有效磁盘数)
公理:你需要一个小连接池,和一个充满了等待连接的线程的队列。

为什么核心数 * 2?
因为线程总是在I/O上阻塞,我们可以让线程/连接数比CPU核心多一些,这样就能够在同样的时间内完成更多的工作。

为什么线程会在I/O上阻塞?
磁盘读写操作的寻址耗时和旋回耗时,读写头需要等待碟片上的目标数据“旋转到位”才能进行操作。在这一时间段(“I/O等待”)内,线程是在 “阻塞” 着等待磁盘。

固态硬盘(SSD)和 机械硬盘(HDD) 线程/连接数的设定区别
SSD不需要寻址,也没有旋转的碟片,所以更少的线程【更接近于CPU核心数】会发挥出更高的性能。只有当阻塞创造了更多的执行机会时,更多的线程数才能发挥出更好的性能。

连接池的大小最终与系统特性相关
比如一个混合了长事务和短事务的系统,通常是任何连接池都难以进行调优的。最好的办法是创建两个连接池,一个服务于长事务,一个服务于短事务。
再例如一个系统执行一个任务队列,只允许一定数量的任务同时执行,此时并发任务数应该去适应连接池连接数,而不是反过来。

你可能感兴趣的:(数据库)