更新时间:2024-06-03 GMT+08:00

线程池

enable_thread_pool

参数说明:控制是否使用线程池功能。该参数属于POSTMASTER类型参数,请参考表1中对应设置方法进行设置。低并发长链接性能敏感场景建议关闭该参数,其他场景建议打开该参数。

取值范围:布尔型

  • on表示开启线程池功能。
  • off表示不开启线程池功能。

默认值:on

thread_pool_attr

参数说明:用于控制线程池功能的详细属性,该参数仅在enable_thread_pool打开后生效,仅sysadmin用户可以访问。

参数类型:字符串

参数单位:

取值范围

该参数分为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进行绑核;5. '(numabind: 0-30)',在NUMA组内利用0-30号CPU core进行绑核。该参数不区分大小写。

默认值

  • 独立部署:'1024,2,(nobind)'(60核CPU/480G内存,32核CPU/256G内存);'512,2,(nobind)'(16核CPU/128G内存);'256,2,(nobind)'(8核CPU/64G内存);'128,2,(nobind)'(4核CPU/32G内存);'64,2,(nobind)'(4核CPU/16G内存)

设置方式:该参数属于POSTMASTER类型参数,请参考表1中对应设置方法进行设置。

设置建议:内存充足且CPU性能好的情况,当业务需要更多连接可以增加该参数值。

static_thread_pool_num

参数说明:线程个数,表示用于创建静态线程池(静态池)的线程个数。该参数仅在enable_thread_pool打开后分布式CN上生效。该参数属于POSTMASTER类型参数,请参见表1中对应设置方法进行设置。

取值范围:整型,0~1024。

默认值:3

CN默认值:10% * group_num * thread_num,其中group_num和thread_num请参见thread_pool_attr。实际配置thread_num+static_thread_pool_num<=min(4096,max_connections)且static_thread_pool_num >= DN分片数 * group_num。

示例: static_thread_pool_num = 10% * 1024 * 2 = 204

  • 创建静态线程池用于防止DN实例耗尽CN线程池线程,保证有可用线程连接DN执行业务。
  • 必须保证thread_pool_attr线程数+static_thread_pool_num配置的线程总数不得超过min(4096, max_connections),否则无法创建静态池成功。且static_thread_pool_num>DN分片数*group_num。
  • static_thread_pool_num为虚拟值,设置后不会立刻生效。当CN线程池满载或者耗尽,CN会主动创建static_thread_pool_num个线程,这些线程构成静态池。
  • CN静态池用于单DN链接业务,静态池对集群每个DN分片线程数量均分,计算公式为:static_thread_pool_num/n(n为DN分片数量), 使用超过计算公式的固定配额线程数则报错。
  • 若静态池线程被多DN链接业务持有则报错归还线程。
  • 静态池创建不支持多租模式下非默认group线程组。
  • static_thread_pool_num参数为0表示关闭静态池功能,若业务不希望由于静态池管控多DN链接可以考虑关闭该功能。
  • 创建静态线程池功能约束:前提为分布式CN开启线程池,当前功能解决DN分片故障的场景,保障CN仍有可用的线程给业务使用,实现业务不中断。若单CN查询导致的线程池占满不在设计解决范围内,同时对业务仅在单CN查询不纳入管控和统计。

thread_pool_stream_attr

参数说明:用于控制stream线程池功能的详细属性,stream线程只在DN生效,该参数仅在enable_thread_pool打开后生效,仅sysadmin用户可以访问。该参数属于POSTMASTER类型参数,请参考表1中对应设置方法进行设置。

取值范围:字符串,长度大于0

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

  • stream_thread_num:stream线程池中的线程总数,取值范围是0~4096。其中0的含义是数据库根据系统CPU core的数量来自动配置线程池的线程数,如果参数值大于0,线程池中的线程数等于stream_thread_num。线程池大小推荐根据硬件配置设置,计算公式如下:stream_thread_num = CPU核数*3~5,stream_thread_num最大值为4096。
  • stream_proc_ratio:预留给stream线程的proc数量比例,浮点类型,默认为0.2,预留proc计算方式为:stream_proc_ratio * stream_thread_num。
  • group_num:线程池中的线程分组个数,取值范围是0~64。其中0的含义是数据库根据系统NUMA组的个数来自动配置线程池的线程分组个数,如果参数值大于0,线程池中的线程组个数等于group_num。thread_pool_stream_attr的group_num需与thread_pool_attr的group_num配置和使用保持一致,若设置为不同值,以thread_pool_attr的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进行绑核;5. '(numabind: 0-30)',在NUMA组内利用0-30号CPU core进行绑核。该参数不区分大小写。thread_pool_stream_attr的cpubind_info需与thread_pool_attr的cpubind_info配置和使用保持一致,若设置为不同值,以thread_pool_attr的cpubind_info为准。

默认值:

stream_thread_num:16

stream_proc_ratio:0.2

group_num、cpubind_info:参见thread_pool_attr

resilience_threadpool_reject_cond

参数说明:用于控制线程池过载逃生的线程池使用率比例。该参数仅在GUC参数enable_thread_pool和use_workload_manager打开时生效。该参数属于SIGHUP类型参数,请参考表1中对应设置方法进行设置。

取值范围:字符串,长度大于0

该参数分为recover_threadpool_percent、overload_threadpool_percent 2部分,这2个部分的具体含义如下:

  • recover_threadpool_percent:线程池恢复正常状态时的线程池使用率,当线程池使用率小于该值时,停止过载逃生并放开新连接接入,取值为0~INT_MAX,设置为多少表示百分之多少。
  • overload_threadpool_percent:线程池过载时的线程池使用率,当线程池使用率大于该值时,表示当前线程池已经过载,触发过载逃生kill会话并禁止新连接接入,取值为0~INT_MAX,设置为多少表示百分之多少。

默认值:'0,0',表示关闭线程池逃生功能。

示例:

resilience_threadpool_reject_cond = '50,90'

表示线程池使用率超过90%后禁止新连接接入并kill堆积的会话,kill会话过程中线程池使用率下降到50%时停止kill会话并允许新连接接入。

  • 线程池使用率可以通过DBE_PERF.local_threadpool_status视图查询获得;线程池设置的初试线程池线程数目可以通过查询thread_pool_attr参数获得。
  • 该参数如果设置的百分比过小,则会频繁触发线程池过载逃生流程,会使正在执行的会话被强制退出,新连接短时间接入失败,需要根据实际线程池使用情况慎重设置。
  • use_workload_manager参数关闭的情况下,如果打开bypass_workload_manager,则该参数也会生效,但是因为bypass_workload_manager是SIGHUP类型,reload方式设置后需要重启数据库才会使得当前功能生效。
  • recover_threadpool_percent和overload_threadpool_percent的值可以同时为0,除此之外,recover_threadpool_percent的值必须要小于overload_threadpool_percent,否则会设置不生效。