
# 线程池
 #### enable_thread_pool
**参数说明** **：**控制是否使用线程池功能。
**参数类型：**布尔型
**参数单位：**无
**取值范围** **：**
- on：表示开启线程池功能。
- off：表示不开启线程池功能。
**默认值** **：**on
**设置方式：** 该参数属于POSTMASTER类型参数，请参考[表1](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/gaussdb-10-0254.html#ZH-CN_TOPIC_0000002527826790__zh-cn_topic_0000002558055361_zh-cn_topic_0000002338364610_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。
**设置建议** **：**在低并发长连接性能敏感场景下，建议关闭该参数，其他场景下建议打开该参数。
**设置不当的风险与影响：**请在充分理解参数含义，并经过测试验证后进行修改。
 #### enable_connect_thread_pool
**参数说明** **：** 控制是否启用建连线程池功能。该功能是针对线程池建连模式的优化，存在对线程池功能的依赖。使用该功能需要先开启线程池参数[enable_thread_pool]。
- 仅当[enable_connect_thread_pool]和[enable_thread_pool]均设置为on时，才会开启建连线程池功能。
- 若[enable_connect_thread_pool]为on而[enable_thread_pool]为off时，将不会开启建连线程池功能。
**参数类型：**布尔型
**参数单位：**无
**取值范围** **：**
- on：表示开启建连线程池功能。
- off：表示不开启建连线程池功能。
**默认值** **：**off
**设置方式：** 该参数属于POSTMASTER类型参数，请参见[表1](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/gaussdb-10-0254.html#ZH-CN_TOPIC_0000002527826790__zh-cn_topic_0000002558055361_zh-cn_topic_0000002338364610_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。
**设置建议** **：** 推荐使用默认值**。**
**设置不当的风险与影响：** 开启后可优化高并发建连对SQL业务抖动的影响，但是会降低连接接入性能，如果对连接性能要求较高，应合理配置[connect_thread_pool_attr]参数及客户端超时时间。
 #### thread_pool_attr
**参数说明** **：** 用于控制线程池功能的详细属性，该参数仅在[enable_thread_pool]打开后生效，仅sysadmin用户可以访问。
**参数类型：**字符串
**参数单位：**无
**取值范围** **：**
该参数分为三个部分，'thread_num, group_num, cpubind_info'，这三个部分的具体含义如下：
- 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进行绑核。该参数不区分大小写。
**默认值** **：**
- 独立部署：'2048,2,(nobind)'（128核CPU/1024G内存）；'1024,2,(nobind)'（128核CPU/512G内存，64核CPU/512G内存，60核CPU/480G内存，32核CPU/256G内存）；'512,2,(nobind)'（16核CPU/128G内存）；'256,2,(nobind)'（8核CPU/64G内存，8核CPU/32G内存）；'128,2,(nobind)'（4核CPU/32G内存）；'64,2,(nobind)'（4核CPU/16G内存）
- 混合部署 CN: 768,2,(nobind)'（128核CPU/1024G内存）；'512,2,(nobind)'（128核CPU/512G内存，64核CPU/512G内存）； '256,2,(nobind)'（32核CPU/256G内存）；'128,2,(nobind)'（16核CPU/128G内存）
  DN: '4096,2,(nobind)'（128核CPU/1024G内存，128核CPU/512G内存，64核CPU/512G内存）；'2048,2,(nobind)'（32核CPU/256G内存）；'1024,2,(nobind)'（16核CPU/128G内存）
  
**设置方式：** 该参数属于POSTMASTER类型参数，请参考[表1](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/gaussdb-10-0254.html#ZH-CN_TOPIC_0000002527826790__zh-cn_topic_0000002558055361_zh-cn_topic_0000002338364610_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。
**设置建议：**内存充足且CPU性能好的情况，当业务需要更多连接时可以增加该参数值。
**设置不当的风险与影响：**默认值即推荐值，不建议修改。修改必须详细确认参数的规格限制，并考虑硬件资源是否足够，否则可能导致集群异常。
![](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
必须确保[thread_pool_attr]配置的线程数与static_thread_pool_num配置的线程数之和不超过min(4096, [max_connections](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/gaussdb-10-0259.html#ZH-CN_TOPIC_0000002527986738__zh-cn_topic_0000002527056202_zh-cn_topic_0000002338364430_zh-cn_topic_0059777636_sa723b719fa70453bb7ec27f323d41c79))，且static_thread_pool_num必须大于DN分片数乘以group_num，否则无法成功创建静态池。
 #### connect_thread_pool_attr
**参数说明** **：** 用于控制建连线程池功能的详细属性，该参数仅在[enable_thread_pool]和[enable_connect_thread_pool]打开后生效，仅sysadmin用户可以访问。
**参数类型：**字符串
**参数单位：**无
**取值范围** **：**
该参数分为四个部分，'thread_num, group_num, cpubind_info, enable_adjust_connect_pool'，这四个部分的具体含义如下：
- thread_num：建连线程池中的初始线程总数，可以动态扩充，取值范围是\[1, Max(8, CPU核数\*0.25)\], 下限为1，上限为8和当前机器CPU核数\*0.25中的较大值，即如果当前机器的总cpu核心数量为16，理论计算出的建连线程池线程上限为4，小于8，则上限为8，此时thread_num取值范围为1\~8; 如果当前机器的总cpu核心数量为64，理论计算出的建连线程池线程上限为16，大于8，则上限为16，此时thread_num取值范围为1\~16。支持超配，超配上限为500，如果thread_num配置值大于上述扩容上限，则扩容功能自动关闭，建连线程池线程数将不会变化，如果thread_num配置值小于上述扩容上限，则根据第四个字段值来判断是否开启扩容功能。
- group_num：建连线程池中的线程分组个数，固定为1，不允许设置为其他值。
- 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进行绑核。该参数不区分大小写。
- enable_adjust_connect_pool：是否关闭建连线程池扩容功能，可以不配置，配置0表示开启，配置1表示主动关闭，默认不配置此字段，表示开启线程池扩容功能。
**默认值** **：**'8, 1, (nobind)'
**设置方式：** 该参数属于POSTMASTER类型参数，请参见[表1](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/gaussdb-10-0254.html#ZH-CN_TOPIC_0000002527826790__zh-cn_topic_0000002558055361_zh-cn_topic_0000002338364610_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。
**设置建议：**内存充足且CPU性能好的情况下，当业务需要更多连接时可以增加该参数值。
**设置不当的风险与影响：**请在充分理解参数含义，并经过测试验证后进行修改，当参数设置超过取值范围时，会导致数据库进程无法正常启动。
#### static_thread_pool_num
**参数说明：** 线程个数，表示用于创建静态线程池（静态池）的线程个数。该参数仅在[enable_thread_pool]打开后的分布式CN上生效。
**参数类型：**整型
**参数单位：**无
**取值范围：**0 \~ 1024
**默认值：** 10% \* group_num \* thread_num，其中group_num和thread_num请参见[thread_pool_attr]。
**设置方式：** 该参数属于POSTMASTER类型参数，请参见[表1](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/gaussdb-10-0254.html#ZH-CN_TOPIC_0000002527826790__zh-cn_topic_0000002558055361_zh-cn_topic_0000002338364610_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。
**设置建议** **：**推荐使用默认值。
**设置不当的风险与影响：**请在充分理解参数含义，并经过测试验证后进行修改。
![](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
- 创建静态线程池用于防止DN实例耗尽CN线程池线程，保证有可用线程连接DN执行业务。
- 必须确保[thread_pool_attr]配置的线程数与static_thread_pool_num配置的线程数之和不超过min(4096, [max_connections](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/gaussdb-10-0259.html#ZH-CN_TOPIC_0000002527986738__zh-cn_topic_0000002527056202_zh-cn_topic_0000002338364430_zh-cn_topic_0059777636_sa723b719fa70453bb7ec27f323d41c79))，且static_thread_pool_num必须大于DN分片数乘以group_num，否则无法成功创建静态池。
- static_thread_pool_num为虚拟值，设置后不会立刻生效。当CN线程池满载或者耗尽，CN会主动创建static_thread_pool_num个线程，这些线程构成静态池。
- 静态线程池包含在整个线程池内部，配置了静态线程池后，业务线程可用的最大数目就会被响应的减少，例如配置静态线程池大小为100，线程池使用上限为500时，实际可使用的正常线程数目上限为400。
- 静态线程池占用连接数，因此会存在静态线程池导致连接达不到配置的max_connections的情况，此时建议可以关闭静态线程池来规避此情况。
- 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用户可以访问。
**参数类型：**字符串
**参数单位：**无
**取值范围：**
该参数分为四个部分，'stream_thread_num, stream_proc_ratio ,group_num ,cpubind_info'，这四个部分的具体含义如下：
- 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]。
**设置方式：** 该参数属于POSTMASTER类型参数，请参考[表1](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/gaussdb-10-0254.html#ZH-CN_TOPIC_0000002527826790__zh-cn_topic_0000002558055361_zh-cn_topic_0000002338364610_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。
**设置建议** **：**在内存充足且CPU性能好的情况下，当业务需要更多并发性能时可以增加该参数值。
**设置不当的风险与影响：**请在充分理解参数含义，并经过测试验证后进行修改。
#### resilience_threadpool_reject_cond
**参数说明** **：** 用于控制线程池过载逃生的线程池使用率比例。该参数仅在GUC参数[enable_thread_pool]和[use_workload_manager](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/gaussdb-10-0294.html#ZH-CN_TOPIC_0000002527826810__zh-cn_topic_0000002558216351_zh-cn_topic_0000002372322349_zh-cn_topic_0059777791_s9608d330c6a14d2cbd6ae75493437820)打开时生效。
**参数类型：**字符串
**参数单位：**无
**取值范围** **：**
该参数分为两部分，'recover_threadpool_percent、overload_threadpool_percent'，这两个部分的具体含义如下：
- recover_threadpool_percent：线程池恢复正常状态时的线程池使用率，当线程池使用率小于该值时，停止过载逃生并放开新连接接入，取值为0\~INT_MAX，设置为多少表示百分之多少。
- overload_threadpool_percent：线程池过载时的线程池使用率，当线程池使用率大于该值时，表示当前线程池已经过载，触发过载逃生kill会话并禁止新连接接入，取值为0\~INT_MAX，设置为多少表示百分之多少。
示例：
```
resilience_threadpool_reject_cond = '50,90'
```
表示线程池使用率超过90%后，禁止新连接接入并kill堆积的会话，kill会话过程中线程池使用率下降到50%时，停止kill会话并允许新连接接入。
**默认值** **：**'0,0'，表示关闭线程池逃生功能。
**设置方式：** 该参数属于SIGHUP类型参数，请参考[表1](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/gaussdb-10-0254.html#ZH-CN_TOPIC_0000002527826790__zh-cn_topic_0000002558055361_zh-cn_topic_0000002338364610_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。
**设置建议** **：**推荐使用默认值。
**设置不当的风险与影响：**请在充分理解参数含义，并经过测试验证后进行修改。
![](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
- 线程池使用率可以通过DBE_PERF.local_threadpool_status视图查询获得；线程池设置的初始线程池线程数目可以通过查询thread_pool_attr参数获得。
- 该参数如果设置的百分比过小，则会频繁触发线程池过载逃生流程，会使正在执行的会话被强制退出，新连接短时间接入失败，需要根据实际线程池使用情况慎重设置。
- recover_threadpool_percent和overload_threadpool_percent的值可以同时为0，除此之外，recover_threadpool_percent的值必须要小于overload_threadpool_percent，否则不会生效。
- use_workload_manager参数关闭的情况下，如果打开bypass_workload_manager，该参数也会生效，但是因为bypass_workload_manager是SIGHUP类型，用reload方式设置后需要重启数据库才会使得当前功能生效。
 
