opengauss兼容mysql的bug规避--引申线程池

发布时间 2023-04-06 16:37:10作者: y_dou

环境:

Opengauss 企业版3.0.0

问题:

建一个兼容B的数据库,使用\c 切库无法进去。

psql 连也进不去,甚至会导致节点异常,甚至切主的情况出现

测试为BUG:

https://gitee.com/opengauss/openGauss-server/pulls/1666

解决:

要开启enable_global_syscache

 

扩展:

enable_global_syscache

要开启enable_global_syscache,使用全局系统缓存功能——系统缓存与会话解耦,绑定到线程上,结合线程池特性达到降低内存占用的目的,同时结合全局缓存,提升缓存命中率,保持性能稳定。

global_syscache_threshold

参数说明:全局系统缓存内存最大占用大小。如果设置的值过小,会导致内存频繁淘汰,内存存在大量碎片无法回收,导致内存控制失效。需要打开enable_global_syscache参数,该参数才生效。

推荐计算公式:热点DB个数和线程个数的最小值乘以每个DB分配的内存大小,即global_syscache_threshold = min(count(hot dbs),count(threads)) * memofdb。 说明:

  • hot dbs:热点DB数,即访问较为频繁的数据库。
  • threads:线程数,在线程池模式下取线程池线程个数和后台线程个数之和,非线程池模式不需要计算这个值,直接使用热点DB数。
  • memofdb:平均每个db应该分配的内存,每个DB的底噪内存是2M,平均每增加一个表或者索引,增加11k内存。

enable_thread_pool

开启线程池

 

thread_pool_attr

该参数分为3个部分,'thread_num, group_num, cpubind_info',这3个部分的具体含义如下:

  • thread_num:线程池中的线程总数,取值范围是0~4096。其中0的含义是数据库根据系统CPU core的数量来自动配置线程池的线程数,如果参数值大于0,线程池中的线程数等于thread_num。线程池大小推荐根据硬件配置设置,计算公式如下:thread_num = CPU核数*3~5,thread_num最大值为4096。
  • group_num:线程池中的线程分组个数,取值范围是0~64。其中0的含义是数据库根据系统NUMA组的个数来自动配置线程池的线程分组个数,如果参数值大于0,线程池中的线程组个数等于group_num。
  • cpubind_info:线程池是否绑核的配置参数。可选择的配置方式有:1. '(nobind)' ,线程不做绑核;2. '(allbind)',利用当前系统所有能查询到的CPU core做线程绑核;3. '(nodebind: 1, 2)',利用NUMA组1,2中的CPU core进行绑核;4. '(cpubind: 0-30)',利用0-30号CPU core进行绑核。该参数不区分大小写。

默认值:'16, 2, (nobind)'

 

 

联想:

我们平时说的连接池和线程池,到底是不是一个东西?

不是的!

连接池是对应用来说的配置,一般在客户端,而线程池是在DB服务器上配置

url=jdbc:mysql://localhost:3306/test?rewriteBatchedStatements=true

username=root

password=123456

driverClassName=com.mysql.jdbc.Driver

initialSize=10

maxActive =20

maxWait=1000

filters=wall

 

 

initialSize 第一次connection建立的物理连接个数

maxActive 最大连接池数量

maxWait 获取连接时,最大等待时间

 

连接池中的连接数量大小应该设置成:数据库能够有效同时进行的查询任务数(通常情况下来说不会高于 2*CPU核心数)。

虽然连接池可以避免连接频繁创建和销毁,但是无法控制数据库里的活动线程数。

在高并发场景下,无法起到保护DB的作用。比较好的方式是将连接池和线程池结合起来使用。

 

Opengauss改成了线程模式,线程池支持更大并发,通过线程池实现session和thread之间的解耦,提高线程的利用率,高并发下不会导致线程的频繁切换。

 

BUT!

启用线程池以后,相当于限制了数据库的并发线程数,当达到最大线程数的时候,其他的线程需要等待,新连接也会卡在连接验证那一步,这时候会造成拨测程序连接超时。