# 线程池
 #### enable_thread_pool
**参数说明** **：**控制是否使用线程池功能。
**参数类型：**布尔型
**参数单位：**无
**取值范围** **：**
- on：表示开启线程池功能。
- off：表示不开启线程池功能。
**默认值** **：**on
**设置方式：** 该参数属于POSTMASTER类型参数，请参见[表1](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/gaussdb-08-0752.html#ZH-CN_TOPIC_0000002793787853__zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。
**设置建议** **：**在低并发长连接性能敏感场景下，建议关闭该参数，其他场景下建议打开该参数。
**设置不当的风险与影响：**请在充分理解参数含义，并经过测试验证后进行修改。
 #### enable_connect_thread_pool
**参数说明** **：** 控制是否使用认证线程池功能。认证线程池是针对线程池建连模式进行的优化，存在对线程池功能的依赖。使用该功能需要先开启线程池参数[enable_thread_pool]。当且仅当enable_connect_thread_pool和[enable_thread_pool]都为true时才会开启认证线程池功能，enable_connect_thread_pool为ture而[enable_thread_pool]为false时不开启。
**参数类型：**布尔型
**参数单位：**无
**取值范围** **：**
- on：表示开启认证线程池功能。
- off：表示不开启认证线程池功能。
**默认值** **：**
- on：新安装的数据库的默认值。
- off：505.2.1.SPC0800版本之前的数据库升级后的默认值。
**设置方式：** 该参数属于POSTMASTER类型参数，请参见[表1](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/gaussdb-08-0752.html#ZH-CN_TOPIC_0000002793787853__zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。
**设置建议** **：** 在通常场景下建议打开该参数**。**
**设置不当的风险与影响：** 开启后可优化高并发建连对SQL业务抖动的影响，但是会降低连接接入性能，如果对连接性能要求较高，应合理配置[connect_thread_pool_attr]参数及客户端超时时间。
 #### thread_pool_attr
**参数说明** **：** 用于控制线程池功能的详细属性，该参数仅在[enable_thread_pool]打开后生效，仅sysadmin用户可以访问。
**参数类型：**字符串
**参数单位：**无
**取值范围** **：**
该参数分为四个部分，'thread_num, group_num, cpubind_info, enable_thread_pool_auto_scaling'，这四个部分的具体含义如下：
- 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进行绑核。当指定了CPU绑核时，为了保证绑核生效，应保证NUMA组和group_num一致。该参数不区分大小写。
- enable_thread_pool_auto_scaling：是否开启线程池自动扩缩容功能。可以不配置，配置1表示开启，配置0表示关闭，默认不配置此字段，表示开启线程池自动扩缩功能。
**默认值** **：**
- 独立部署：'2048,2,(nobind)'（128核CPU/1024G内存）；'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](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/gaussdb-08-0752.html#ZH-CN_TOPIC_0000002793787853__zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。
**设置建议：**内存充足且CPU性能好的情况，当业务需要更多连接时可以增加该参数值，修改前需要在测试环境验证通过。
**设置不当的风险与影响：**若thread_pool_attr设置值大于等于max_connections，会导致proc资源全部被线程池占用，出现proc资源不足的问题。默认值即推荐值，不建议修改。修改必须详细确认参数的规格限制，并考虑硬件资源是否足够，否则可能导致集群异常。
![](https://support.huaweicloud.com/distributed-ref-v10-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-ref-v10-gaussdb/gaussdb-08-0757.html#ZH-CN_TOPIC_0000002764308724__zh-cn_topic_0059777636_sa723b719fa70453bb7ec27f323d41c79))，且static_thread_pool_num必须大于DN分片数乘以group_num，否则无法成功创建静态池。
 #### connect_thread_pool_attr
**参数说明** **：** 用于控制建连线程池功能的详细属性，该参数仅在[enable_thread_pool]和[enable_connect_thread_pool]打开后生效，仅sysadmin用户可以访问。
**参数类型：**字符串
**参数单位：**无
**取值范围** **：**'auto'或由'thread_num, group_num, cpubind_info, enable_adjust_connect_pool'配置项组成的字符串两种形式。
- 取值为'auto'形式时，表示建连线程池参数将由数据库根据部署机器的规格自动计算后设置。其中4核CPU规格场景下，实际生效为'8,1,(cpubind: *绑定任意两个有效CPU*)'；其他规格场景下，实际生效为'8,1,(nobind)'。
- 取值为由配置项组成的字符串形式时，格式为'thread_num, group_num, cpubind_info, enable_adjust_connect_pool'，配置项的具体含义如下：
  - thread_num：建连线程池中的初始线程总数，可以动态扩充，取值范围是\[1, Max(8, CPU核数)\]，下限为1，上限为8和当前部署机器CPU核数中的较大值，即如果当前部署机器的总CPU核数为4，理论计算出的建连线程池线程上限为4，小于8，则上限为8，此时thread_num取值范围为\[1, 8\]；如果当前部署机器的总CPU核数为64，理论计算出的建连线程池线程上限为64，大于8，则上限为64，此时thread_num取值范围为\[1, 64\]。支持超配，超配上限为500，如果thread_num配置值大于扩容上限，则扩容功能自动关闭，建连线程池线程数将不会变化，如果thread_num配置值小于扩容上限，则根据enable_adjust_connect_pool字段值进行判断是否开启扩容功能。
  
  - group_num：建连线程池中的线程分组个数，固定为1，不允许设置为其他值。
  
  - cpubind_info：建连线程池是否绑核。可选择的配置方式有：
    - '(nobind)' ：建连线程池不进行绑核。
    
    - '(allbind)'：利用当前系统所有能查询到的CPU进行线程绑核。
    
    - '(nodebind: 1, 2)'：利用NUMA组1、2中的CPU进行线程绑核。
    
    - '(cpubind: 0-30)'：利用0\~30号CPU进行线程绑核。
    
    - '(numabind: 0-30)'：在NUMA组内利用0\~30号CPU进行线程绑核。该参数不区分大小写。
     
  
  - enable_adjust_connect_pool：是否关闭建连线程池扩容功能。该配置项可缺省，默认为0，表示开启线程池扩容功能；配置为1时，表示主动关闭。若触发建连线程池过载，过载时的应急扩容不受该参数控制。
   
**默认值** **：**'auto'
**设置方式：** 该参数属于POSTMASTER类型参数，请参见[表1](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/gaussdb-08-0752.html#ZH-CN_TOPIC_0000002793787853__zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。
**设置建议：**内存充足且CPU性能好的情况下，当业务需要更多连接时可以增加该参数值。
**设置不当的风险与影响：**请在充分理解参数含义，并经过测试验证后进行修改，当参数设置超过取值范围时，会导致gaussdb进程无法正常启动。
![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
- 调整该参数中的thread_num值对系统会产生相应的影响，当thread_num调小时，建连线程池占用的资源少，在大并发建连场景下，建立连接性能会下降，系统的抗过载能力会提升；当thread_num调大时，建连线程池会占用更多的系统资源，在大并发建连场景下，建立连接性能会提升，系统的抗过载能力会受到部分影响。请根据实际业务需求在参数允许的范围内进行合理配置。
- 当建连线程池持续2秒无法分配线程处理建立连接的会话时，将触发线程池过载。在过载状态下，系统优先响应最新的建连会话，同时强制关闭等待时间已超过2秒的建连会话。
 
#### 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-ref-v10-gaussdb/gaussdb-08-0752.html#ZH-CN_TOPIC_0000002793787853__zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。
**设置建议** **：**推荐使用默认值。
**设置不当的风险与影响：**请在充分理解参数含义，并经过测试验证后进行修改。
![](https://support.huaweicloud.com/distributed-ref-v10-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-ref-v10-gaussdb/gaussdb-08-0757.html#ZH-CN_TOPIC_0000002764308724__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-ref-v10-gaussdb/gaussdb-08-0752.html#ZH-CN_TOPIC_0000002793787853__zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。
**设置建议** **：**在内存充足且CPU性能好的情况下，当业务需要更多并发性能时可以增加该参数值。
**设置不当的风险与影响：**请在充分理解参数含义，并经过测试验证后进行修改。
#### max_stream_threads
**参数说明：**当运行stream线程中除sync quit状态外的线程数（活跃stream线程数）超过max_stream_threads上限，等待降低到max_stream_threads范围内再进行复用或拉起新stream线程。
当stream线程数超过max_stream_threads后，默认分批退出空闲stream，直到stream线程数小于等于max_stream_threads或不存在空闲stream线程。
该参数仅在[enable_thread_pool]打开后生效。
**参数类型：**整型
**参数单位：**无
**取值范围：**0 \~ 4096
**默认值：**
独立部署：
4096（192核CPU/1536G内存，128核CPU/1024G内存，104核CPU/1024G内存，96核CPU/1024G内存）；2048（96核CPU/768G内存，80核CPU/640G内存）；1024（64核CPU/512G内存，60核CPU/480G内存，32核CPU/256G内存）；128（16核CPU/128G内存）；64（8核CPU/64G内存）；32（4核CPU/32G内存）；16（4核CPU/16G内存）
混合部署：
2048（192核CPU/1536G内存，128核CPU/1024G内存，104核CPU/1024G内存，96核CPU/1024G内存）；1024（96核CPU/768G内存，80核CPU/640G内存）；512（80核CPU/512G内存，72核CPU/576G内存，64核CPU/512G内存，60核CPU/480G内存，32核CPU/256G内存）；64（16核CPU/128G内存）；32（8核CPU/64G内存）；16（4核CPU/32G内存）；16（4核CPU/16G内存）
**设置方式：** 该参数属于SIGHUP类型参数，请参见[表1](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/gaussdb-08-0752.html#ZH-CN_TOPIC_0000002793787853__zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。
**设置建议** **：**在内存充足且CPU性能良好的情况下，若业务需要更高的并行执行性能，可适当增加该参数值，反之，则减少。
**设置不当的风险与影响：**
- 若设置该参数值过小，会导致无法生成并行执行计划，或使执行计划因等待可用stream线程而排队，增加查询延迟。
- 若设置该参数值过大，而CPU核数较少时，可能会引发stream线程占用大量CPU资源，影响其他业务性能。
![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
max_stream_threads用于单个DN的stream线程上限管控，设置为0表示关闭管控。
#### stream_resource_control_attr
**参数说明：**包含cpu_control_threshold、stop_stream_create_threshold和os_run_queue_threshold三部分，分别控制进行CPU上限控制的阈值，对新stream业务默认报错的阈值，操作系统中处于可运行状态的总线程数超过CPU核数的倍数阈值。
该参数仅在[enable_thread_pool]打开后生效。
**参数类型：**字符串
**参数单位：**无
**取值范围：**
该参数分为三个部分，'cpu_control_threshold, stop_stream_create_threshold, os_run_queue_threshold'，这三个部分的具体含义如下：
- cpu_control_threshold：控制进行CPU上限控制的阈值，取值范围为0\~100。
- stop_stream_create_threshold：对新stream业务默认报错的阈值，取值范围为0\~100。
- os_run_queue_threshold：操作系统中处于可运行状态的总线程数超过CPU核数的倍数阈值，取值范围为0\~100。
cpu_control_threshold、stop_stream_create_threshold、run_queue_threshold均为0时表示该功能关闭。
当cpu_control_threshold、stop_stream_create_threshold均生效时，需满足cpu_control_threshold \<= stop_stream_create_threshold。
**默认值：**
- cpu_control_threshold：0
- stop_stream_create_threshold：0
- os_run_queue_threshold：0
**设置方式：** 该参数属于SIGHUP类型参数，请参见[表1](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/gaussdb-08-0752.html#ZH-CN_TOPIC_0000002793787853__zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。
**设置建议** **：**推荐使用默认值。
**设置不当的风险与影响：**请在充分理解参数含义，并经过测试验证后进行修改。
![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
当CPU使用率超过stop_stream_create_threshold时，尝试启动新stream业务会产生报错"Stream worker is temporarily unavailable. Try later..."。
#### thread_pool_idle_time
**参数说明** **：** 用于限制线程池线程的空闲时间，当线程池线程空闲时间超过该参数的设置时，则线程退出，并释放相关的内存资源。该参数仅在[enable_thread_pool]打开后生效，仅sysadmin用户可以访问。该参数不作用于认证线程池和静态线程池的线程。
**参数类型：**整型
**参数单位：**s（秒）
**取值范围** **：**0 \~ 2147483647
**默认值** **：**300
**设置方式：** 该参数属于SIGHUP类型参数，请参见[表1](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/gaussdb-08-0752.html#ZH-CN_TOPIC_0000002793787853__zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。
**设置建议** **：**该参数影响线程池的线程数量，不建议设置过小。设置该参数越小，线程池的线程启停可能越频繁，会影响性能。
**设置不当的风险与影响：**请在充分理解参数含义，并经过测试验证后进行修改。
#### resilience_threadpool_reject_cond
**参数说明** **：** 用于控制线程池过载逃生的线程池使用率比例。该参数仅在GUC参数[enable_thread_pool]和[use_workload_manager](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/gaussdb-08-0793.html#ZH-CN_TOPIC_0000002793707195__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会话并允许新连接接入。kill会话策略为：优先kill空闲会话；再将会话按照会话状态（会话状态相同则按照会话开始时间从早到晚）排序，依次kill会话。
**默认值** **：**'0,0'，表示关闭线程池逃生功能。
**设置方式：** 该参数属于SIGHUP类型参数，请参见[表1](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/gaussdb-08-0752.html#ZH-CN_TOPIC_0000002793787853__zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。
**设置建议** **：**推荐使用默认值。
**设置不当的风险与影响：**请在充分理解参数含义，并经过测试验证后进行修改。
![](https://support.huaweicloud.com/distributed-ref-v10-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方式设置后需要重启数据库才会使得当前功能生效。
- 将参数从其它值动态设为"0,0"后，若此时已启动会话查杀，不会终止查杀动作，可等待10s以上再连接数据库防止新连接被查杀。
 
