前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >这个关于连接池的结论,你绝对想不到

这个关于连接池的结论,你绝对想不到

作者头像
腾讯云数据库 TencentDB
发布于 2021-03-04 11:10:39
发布于 2021-03-04 11:10:39
7350
举报

Part1 前言

在开源网站github上,有一段关于JDBC连接池的视频,演示了同等业务压力下,不同的连接池线程数设置对数据库性能的影响,并用文字进行了深入分析,得出在部分情况下,连接数/并发数并不一定是越高越好这样有意思的结论,本文主要内容为英文原文的翻译(推荐阅读原文,原文链接见文末)。

连接池是创建和管理一个连接的缓冲池的技术,这些连接准备好被任何需要它们的线程使用。

Part2 一个1万用户的测试

开发者在配置连接池的时候经常会犯下一些错误,因为理解了一些连接池参数的意义之后,实际配置的数值可能是反直觉的。

假设有一个网站总是有 10000 个用户在访问,并且 TPS 为 20000,一般都会这么考虑:连接池需要设置成多大才能承载这个业务压力?但是真相可能会非常令人意外:需要考虑的是连接池需要设置成多小。

第一轮测试使用了 2048 个线程作为连接池的配置,测试结果如下图:

2048线程

TPS 约 160k 左右,实际 SQL 执行的时间是 78ms,在连接池队列的等待时间为 39ms,截图最下方展示了等待事件的 TOP 5,数据库层面有很多的等待事件。CPU 的使用率也很高(dbsvr1):

CPU 使用率

当连接池的线程数降到 1024 的时候,测试结果如下图:

1024 线程

TPS 约 170k 左右,没有明显的变化,队列等待时间有少量下降,但是 SQL 的执行时间从 78ms 降到了 38ms,效果很明显。而等待事件中,CPU 等待事件也变多了。

当连接池的线程数降到 96 的时候,测试结果如下图:

96 线程

TPS 约 200k 左右,提升了约 20%,队列等待时间和 SQL 执行时间都有大幅度的下降,等待事件中全部变成了 CPU 等待。

Part3 原因是什么?

不止数据库,其他的软件也有类似情况,比如 4 线程的 Nginx web-server 为什么会比 100 线程的 Apache web-server 性能要好。这实际上和计算机 CPU 和系统的特点有关,有时候,线程少比线程多要好。

现实情况中,即便只有一核,看起来也能处理数十个或者是数百个线程。但是很多人(应该要)知道这是是操作系统的时分(时间分片)技术带来的效果。

实际上一个核心是只能执行一个线程的工作的,但是操作系统通过上下文切换让 CPU 的核心把工作内容切换成其他线程的任务,通过不停的切换,达到了“并行处理工作”的效果。

从理论上说,先执行完工作 A,再执行工作 B 是比通过上下文切换“并行”执行要快,因为上下文切换是会浪费时间的。因此一旦线程的数量超过了 CPU 的核心数,继续加线程数只会让任务处理越来越慢。

一、有限的资源

当然,实际情况并不会像上文描述一样那么简单,但是变慢的现象一般还是存在的。

可能成为数据库瓶颈的,一般就是三大基础资源:CPU,磁盘,网络。内存其实也是应该考虑的一项资源,不过内存的带宽和磁盘,网络要差上几个数量级,所以一般不会先遇到瓶颈。

假设磁盘和网络都没有瓶颈,那么事情会变得很简单:在一个 8 核的服务器上,8 个线程是最佳的性能,超过 8 线程之后就会因为上下文切换导致性能被浪费。

当加上磁盘和网络的影响之后,事情就不是那么简单了,传统的机械盘由于存在碟片转动以及寻道时间等消耗,如果一个核心一直在处理一个线程的任务,那么就会有不少时间处于“IO 等待”,触发这个等待事件的时候 CPU 核心是空闲状态的,因此通过上下文切换,去执行其他线程的任务能够高效的利用 CPU 核心的计算能力。

因此在现实中,存在线程数高于 CPU 核心数时,性能在继续提升的现象。

那么到底线程数设置为多少会比较好?从上面的描述可以知道,这个数字取决于磁盘系统,由于 SSD 存储的普及,现在的磁盘存储已经没有寻道时间或者碟片转动的消耗了。那么因为 SSD 的“IO 等待”很少,所以能设置更高的线程数?

结论可能是 180 度反转的。正因为“IO 等待”很少,所以 CPU 在处理线程任务的时候,空闲(即被 IO 阻塞)的时间很少,所以线程数越接近核心数,性能越好。更多的线程适合于经常被阻塞的场景,因为大量的空闲、阻塞时间可以用来执行其他线程的任务。

网络方面的情况也和磁盘比较类似,当写入的数据超过网卡的写入/发送队列的上限时,也会出现阻塞的情况,使用高流量,比如 10G 的网卡比 1G 的网卡更不容易出现阻塞。不过网络瓶颈的优先级较低,一般是最后才会考虑到的,甚至有一些人会完全忽略网络瓶颈的可能性(取决于网络环境建设能力)。

图表比文字更形象,可以参考如下测试结果图:

二、测试结果

这个测试结果来自于 PostgreSQL 基准测试,纵坐标是 TPS,横坐标是 Client 数量,从 1 到 50 个线程的并发,虽然测试中展示了线程数从 2048 降到 96 的测试结果,但是 96 实际上都太高了,除非服务器上的核心数有 16 个或者 32 个。

三、计算公式

PostgreSQL 项目组给了一个计算公式来计算并发的连接数,计算出来的值可以作为最初的参考设置。这个计算方式其实对大多数数据库都有参考价值。具体的设置建议以参考值为基准,尽量在接近生产压力的环境下进行测试和调整。

计算公式为:connections = ((core_count * 2) + effective_spindle_count)

core_count:不是“超线程”技术之后看到的核心数,而是实际的核心数。

effective_spindle_count:如果数据可以完全 cache 到内存则取 0,否则随着 cache 命中率降低,则这个数值会变高。MySQL 方面,可以认为是 innodb_buffer_pool 的命中率。

所以一个 4 核的酷睿 I7 服务器只有一块磁盘的情况下,连接池的线程数可以设置成:9 = ((4 * 2) + 1),用 10 作为一个取整的数值就不错。

看起来有点低?可以试试看,可以打个赌,这个设置可以轻松支撑 3000 前端用户,接近 6000 TPS 的简单查询。用同样的硬件配置,当连接数设置得比 10 高很多的时候,可以从压力测试中看到 TPS 开始下降,前端用户的响应时间开始攀升。

四、公理

应用需要一个小的“池子”,和等待使用这个池子中连接的应用线程。

如果有个网站有 10000 个前端用户,连接池设置成 10000 会非常的疯狂,1000 也会很恐怖,甚至 100 都过量了。

实际上连接池的线程数只需要几十就够了,剩下的应用线程只需要在连接池那里等待连接可用就行了。如果连接池的线程数参数已经好好优化过,那么这个设置一般不会比 core_count * 2 高,或者不会高很多。

然而在实际情况中,内部 web 应用会使用一些“令人惊奇”的设置:比如,仅有几十个用户在周期性的执行一些操作,但是连接池的线程数设置为 100。请不要过度配置这些参数和数据库。

五、Pool-locking

Pool-locking 被关注的原因是会出现单个应用层线程同时使用多个数据库连接的情况,这个问题更多的是应用层需要考虑的。

当然,增加连接池的线程数可以减少这种场景下互相抢占连接池线程的几率,但是强烈建议先在应用侧考虑如果解决这个问题,而不是直接增大连接池的线程数。

比如最大有 N 个应用层的线程,每个应用层的线程需要使用 M 个数据库连接,那么连接池想要避免 Pool-locking 就至少需要N x (M - 1) +1个数据库连接。在某些场景下,使用 JTA(Java Transaction Manager)可以显著的减少当个应用层线程需要的数据库连接数,因为getConnection()这个函数会返回当前事务已经持有的数据库连接。

Part5 结论

连接池的线程数和实际的情况是紧密相关的,连接数/并发数并不一定是越高越好。

比如一套系统中,一部分业务逻辑使用长连接,一部分业务使用短连接,最好的办法是创建两个连接池,而不是考虑怎么去优化一个池子的设置。

另外一些系统则存在外部原因会限制数据库连接数,比如业务层的 JOB 并发数量是有上限的,或者是固定的,那么连接池的线程数就可以参考这些“外部原因”的限制,设置成一样的值,或者是在这个数量附近浮动。

声明:本文由腾讯云数据库产品团队整理翻译,原内容来自于github(原文链接:https://github.com/brettwooldridge/HikariCP/wiki/About-Pool-Sizing),作者Leo Bayer@HikariCP。翻译目的在于传递更多全球最新数据库领域相关信息,侵权请联系删除。

- End -

《腾讯云数据库专家服务》是由腾讯云数据库技术服务团队维护的社区专栏,涵盖了各类数据库的实际案例,最佳实践,版本特性等内容。目前专栏文章仍在持续丰富中,欢迎在文章末尾留言互动,给出宝贵的建议。

更多精彩

用数据库的三大糟心时刻,你中招了吗

98%的DBA不知道的数据库内存知识点

↓↓一年19.9特惠数据库点这儿~

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-03-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 腾讯云数据库 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
AMBA、AHB、APB、AXI总线介绍及对比
AMBA (Advanced Microcontroller Bus Architecture) 高级微处理器总线架构
数字芯片社区
2020/07/14
3.2K0
AMBA、AHB、APB、AXI总线介绍及对比
AMBA总线架构简介
于是乎,我们想到了总线,用一个统一的接口协议,设计出一个符合要求的总线,然后将ARM核和各种外设模块挂载在总线上,这样,命令和数据似乎便可以在CPU和外设之间自由穿梭。
233333
2023/10/31
6890
AMBA总线架构简介
AMBA之AHB总线学习笔记
AHB同是由ARM提出的总线规范,全称为Advanced High Performance Bus,高级高性能总线(高性能、高速时钟),主要用于高速模块(如CPU、DMA、DSP)之间的连接,作为SoC的片上系统总线,它包括以下特性:
根究FPGA
2020/09/10
1.8K0
AMBA之AHB总线学习笔记
AXI接口协议详解-AXI总线、接口、协议
上面介绍了AMBA总线中的两种,下面看下我们的主角—AXI,在ZYNQ中有支持三种AXI总线,拥有三种AXI接口,当然用的都是AXI协议。其中三种AXI总线分别为:
碎碎思
2020/09/10
12.8K1
AXI总线知多少?
AXI(Advanced eXtensible Interface)是一种总线协议,该协议是ARM公司提出的AMBA3.0中最重要的部分,是一种面向高性能、高带宽、低延迟的片内总线。AMBA4.0将其修改升级为AXI4.0。
数字芯片社区
2020/07/14
3.2K0
AXI总线知多少?
AMBA总线协议(一)——一文看懂APB总线协议
AMBA(Advanced Microcontroller Bus Architecture) 总线是由ARM公司提出的一种开放性的片上总线标准,它独立于处理器和工艺技术,具有高速度低功耗等特点。
233333
2023/10/30
3K0
AMBA总线协议(一)——一文看懂APB总线协议
AXI协议
AXI(Advanced eXtensible Interface)是一种总协议,该协议是ARM公司提出的AMBA(Advanced Microcontroller Bus Architecture)3.0协议中最重要的部分,是一种面向高性能、高带宽、低延迟的片内总线。它的地址/控制和数据相位是分离的,支持不对齐的数 据传输,同时在突发传输中,只需要首地址,同时分离的读写数据通道、并支持显著传输访问和乱序访问,并更加容易并行时序收敛。AXI是AMBA 中一个新的高性能协议。AXI 技术丰富了现有的AMBA
瓜大三哥
2018/02/24
1.6K0
AXI协议
AMBA之APB总线学习笔记
APB、AHB、AXI AMBA(Advanced Micro-controller Bus Architecture)用于芯片内各个部件的互联,包含三种类型总线:APB、AHB以及AXI。
根究FPGA
2020/08/31
4K0
常见的AXI总线仲裁器概述
AMBA AXI 总线协议以高性能、高频率的系统设计为目标,适合高带宽、低延迟的系统设计,可以达到高频率的操作而不需要复杂的总线桥,满足众多部件的接口要求,具备高度灵活的互联结构,并且向后兼容 AHB 和 APB 接口。
数字IC小站
2020/06/30
3.5K0
AHB总线传输(时序)
如果是写操作,master获取HREADY高信号,表明slave已成功接收数据,操作成功;
数字芯片社区
2020/08/27
7.2K0
AHB总线传输(时序)
AHB总线(宏观构造)
① AHB主设备Master; 发起一次读/写操作;某一时刻只允许一个主设备使用总线;
数字芯片社区
2020/08/27
1.2K0
AHB总线(宏观构造)
AMBA (Advanced Microcontroller Bus Architecture) 高级微控制器总线架构
AMBA (Advanced Microcontroller Bus Architecture) 高级微控制器总线架构
FPGA开源工作室
2021/07/09
1.6K0
深入AXI4总线-[二]架构
作为类比,SPI 总线有 2 条单向传输通道:MISO, MOSI。SPI 输入和输出的数据,大路朝天,各走一条。
空白的贝塔
2020/06/24
1.2K0
深入AXI4总线-[二]架构
Xilinx FPGA AXI4总线(一)介绍【AXI4】【AXI4-Lite】【AXI-Stream】
(3)自定义一个 AXI-Lite 的 IP 作为从机设备 Slave,并将其挂载到 AXI Interconnect 上,由 ZYNQ 的 PS 侧作为主机来控制 LED;
FPGA探索者
2021/03/29
6K0
Xilinx FPGA AXI4总线(二)用实例介绍 5 个读写通道
AXI4协议是一个点对点的主从接口协议,数据可以同时在主机(Master)和从机(Slave)之间双向传输,且数据传输大小可以不同。
FPGA探索者
2021/03/30
4.6K0
Xilinx FPGA AXI4总线(二)用实例介绍 5 个读写通道
深入AXI4总线-[三]传输事务结构
那么在数据传输的范畴中,就使用 burst 来表示一种传输模式:在一段时间中,连续地传输多个(地址相邻的)数据。此时可译为突发传输或者猝发传输。
空白的贝塔
2020/06/24
3.1K0
深入AXI4总线-[三]传输事务结构
Xilinx FPGA AXI4总线(三)——握手机制、通道依赖性及AXI-Lite握手实例
AXI4:高性能内存映射需求(如读写DDR、使用BRAM控制器读写BRAM等),为了区别,有时候也叫这个为 AXI4-Full;
FPGA探索者
2021/04/15
3.4K0
Xilinx FPGA AXI4总线(三)——握手机制、通道依赖性及AXI-Lite握手实例
AXI总线简介(一)
AXI4.0-lite是AXI的简化版本,ACE4.0 是AXI缓存一致性扩展接口,AXI4.0-stream是ARM公司和Xilinx公司一起提出,主要用在FPGA进行以数据为主导的大量数据的传输应用。
瓜大三哥
2019/06/20
2.1K0
AXI学习笔记-11.AXI总线结构2.AXI接口时序3.数据结构4.传输特性
握手信号包括VALID和READY信号,传输行为仅在VALID和READY同时有效时发生。其中:
月见樽
2018/11/19
8.9K0
AXI是Interface还是Bus?
AXI全称Advanced eXtensible Interface,是Xilinx从6系列的FPGA开始引入的一种接口协议,主要描述了主设备和从设备之间的数据传输方式。该协议是AMBA3.0(Advanced Microcontroller Bus Architecture)中最重要的部分,是一种面向高性能、高带宽、低延迟的片内接口协议。AMBA4.0将其修改升级为AXI4.0,如下图所示。
Lauren的FPGA
2020/09/10
2.2K0
AXI是Interface还是Bus?
相关推荐
AMBA、AHB、APB、AXI总线介绍及对比
更多 >
LV.0
这个人很懒,什么都没有留下~
目录
  • 开发者在配置连接池的时候经常会犯下一些错误,因为理解了一些连接池参数的意义之后,实际配置的数值可能是反直觉的。
  • 假设有一个网站总是有 10000 个用户在访问,并且 TPS 为 20000,一般都会这么考虑:连接池需要设置成多大才能承载这个业务压力?但是真相可能会非常令人意外:需要考虑的是连接池需要设置成多小。
    • 三、计算公式
      • 四、公理
    • 五、Pool-locking
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档