数据库连接池终于搞对了,这次直接从100ms优化到3ms!

上周,一位客户问我有关数据库连接池优化的问题,我告诉他我自己经历过的陷阱。
事实上,优化数据库连接池的关键是懂得如何定制配置。
下面我就详细的告诉大家。

首先,连接池大小调整是一个大问题。
很多人认为连接池越大越好,但事实并非如此。
我以前犯过这个错误,结果是当并行度很高时系统的响应能力下降。
后来我通过实验发现,将连接池从2 04 8 个减少到1 02 4 个,实际上减少了SQL执行时间。
如果进一步减少到 9 6 个,平均等待时间将下降到 1 毫秒,SQL 执行时间仅为 2 毫秒。
这就像开车一样。
你拥有的汽油越多,你走得就越快。
这取决于道路状况和车辆状况。

那么你需要了解一些计算机科学的基础知识。
例如,操作系统如何使用时间切片和上下文切换来给人以多个线程同时运行的印象。
我以前不知道。
结果线程太多,CPU太忙,大量时间浪费在上下文切换上。
现在我知道了,需要根据CPU核心数来确定线程数,才能最大限度地提高性能。

我们来谈谈磁盘和网络的影响。
磁盘 I/O 和网络阻塞都是性能瓶颈,但它们往往比 CPU 和网络更重要。
之前我忽略了网络带宽的问题,结果并发高的时候网络就成了瓶颈。
现在我知道带宽必须跟上才能保证数据传输顺利。

此外,连接池大小的计算公式也至关重要。
以前都是根据自己的感觉来调整,后来学习了公式,根据核心数来调整,效果明显更好。

总之,有一些必须考虑的公理和预防措施。
例如,连接池的大小应该与数据库可以同时运行的查询任务的数量相对应。
此数量通常不会超过 CPU 核心数量的两倍。

所以当你从1 00ms优化到3 ms时,你实际上是在正确应用这些原则和方法。
无论如何,这取决于你。
这些方法基本上可以帮助你提高数据库连接池的性能。
我现在还在想这个问题,如何进一步优化呢?

数据库连接池到底应该设多大?看完可能会颠覆你的认知

连接池的大小与CPU核心数密切相关。
核心数是主CPU。
例如,对于8 核CPU,常见的是设置1 6 个连接池。

并发用户数并不是直接的决定因素。
对于 1 0,000 个并发用户,1 ,000 个连接池就足够了。

磁盘性能很重要。
为了驱动SSD硬盘,连接池可以达到CPU核心数的两倍。

网络方法常常被忽视。
网络连接速度慢会影响池的效率。

参考公式:链接数=有效磁盘数+CPU核心数。
只是比较,不绝对。

特殊系统,例如长事务和短事务的混合,可能有两个连接池。

评价一下自己。

数据库连接池应该设置成多大?

2 02 2 年,我参与了一个特定城市的大型系统优化项目。
该项目涉及到数据库连接池配置的问题。
当时我很困惑,因为连接池大小设置太大,导致性能明显下降。
后来我意识到合适的连接池大小应该根据服务器的CPU核数、磁盘类型和业务类型综合计算。

假设服务器有8 个CPU核,使用HDD磁盘,业务类型为CPU密集型。
按照通常的建议,连接池的初始值应该是(8 2 )+1 ,对应1 7 个连接。
但这个值还需要通过压力测试来完善。

关于性能的下降,我不得不说,在一次测试中,连接池从9 6 个扩大到2 04 8 个。
这将响应时间从3 毫秒增加到1 00毫秒,同时CPU使用率保持在9 5 %左右。
这是因为我忽略了当线程数量超过 CPU 核心数量时,上下文切换开销会抵消并行处理的好处。

对于CPU密集型业务,连接数应等于CPU核心数(不包括超线程)。
例如,如果8 核服务器处理纯计算任务,将连接数设置为8 可以最大化吞吐量。
对于SSD硬盘等I/O密集型业务,连接数应接近CPU核心数,因为SSD没有寻址和旋转延迟,过多的连接会导致并发争用,降低性能。

对于混合业务,最好将长事务和短事务分开,为长期分析查询和实时短查询创建独立的连接池。
另外,如果业务只需要N个任务并发,比如限电场景,则连接数应该设置为N,而不是根据并发量来调整。

综上所述,数据库连接池的大小不宜一味追求,而应设置为数据库能够同时有效处理的查询任务数,通常不超过CPU核心数的2 倍。
根据服务器配置计算初始值,然后通过压力测试进行验证和优化。
这是我的经验法则。
正确设置连接池可以显着提高吞吐量并减少延迟,同时避免资源浪费和系统崩溃的风险。