opengauss兼容mysql的bug规避--引申线程池
环境:
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!
启用线程池以后,相当于限制了数据库的并发线程数,当达到最大线程数的时候,其他的线程需要等待,新连接也会卡在连接验证那一步,这时候会造成拨测程序连接超时。
本文来自博客园,作者:{dyy},转载请注明原文链接:{https://www.cnblogs.com/ddlearning/}