
# 连接线程池
#### 功能介绍
当数据库并发连接过多时，存在大量资源竞争，MySQL服务器的性能会发生明显的下降。华为云RDS for MySQL提供了连接线程池，能够以少量活跃线程来服务大量数据库连接，将连接和执行解耦，在高并发场景下提高数据库性能。
#### 功能特点
华为云RDS for MySQL连接线程池具有以下特点：
- 避免性能瓶颈，可以处理大量数据库连接，减少资源的争抢和上下文切换。
- 限制并发事务的数量，当数据库负载较高时，优先保障正在执行的事务。
- 避免由于连接得不到及时处理而出现线程异常问题。
- 当事务在等待IO和锁时，释放CPU资源以服务其他连接。
 
#### 线程池相关操作
- 查询线程池参数 通过**show variables**命令查询线程池参数。
  ```
  show variables like 'threadpool%';
  +-----------------------------------+------------+
  | Variable_name                     | Value      |
  +-----------------------------------+------------+
  | threadpool_enabled                | ON         | 
  | threadpool_high_prio_tickets      | 4294967295 | 
  | threadpool_idle_timeout           | 60         |
  | threadpool_long_conn_time         | 2          |
  | threadpool_max_threads            | 100000     | 
  | threadpool_oversubscribe          | 3          |
  | threadpool_prio_kickup_timer      | 1000       | 
  | threadpool_rec_launch_time        | ON         | 
  | threadpool_size                   | 128        | 
  | threadpool_slow_conn_log          | ON         |
  | threadpool_slow_conn_log_interval | 30         |
  | threadpool_slow_launch_time       | 2          | 
  | threadpool_stall_limit            | 500        | 
  +-----------------------------------+------------+
  ```
  表1线程池参数说明 
  | 参数名                               | 参数描述                                                     |
  |:---|:---|
  | threadpool_enabled                | 开启或关闭线程池。                                                |
  | threadpool_high_prio_tickets      | 高优先级线程持有的tickets数量。                                      |
  | threadpool_idle_timeout           | 线程销毁前等待的空闲时间（单位：秒）。                                      |
  | threadpool_long_conn_time         | 登录时间超过此值，则在日志中打印此次登录信息。                                  |
  | threadpool_max_threads            | 线程池共能创建的线程上限。                                            |
  | threadpool_oversubscribe          | 每个线程组中最多能创建的额外线程数。                                       |
  | threadpool_prio_kickup_timer      | 低优先级队列中最长停留时间（单位：毫秒）。                                    |
  | threadpool_rec_launch_time        | 记录线程启动时间。                                                |
  | threadpool_size                   | 线程组数量。                                                   |
  | threadpool_slow_conn_log          | 是否记录慢登录到error log。                                       |
  | threadpool_slow_conn_log_interval | 记录频率，记录一次慢登录后，在此时间间隔内不再记录。                               |
  | threadpool_slow_launch_time       | 如登录、查询时间大于此值，则status中 threadpool_slow_launch_request增加1。 |
  | threadpool_stall_limit            | 线程组忙碌检查间隔。                                               |
     
  表2线程池可修改参数说明 
  | 参数名                      | 是否是动态参数 | 数据类型    | 取值范围       | 说明                                                                                                                                                                            |
  |:---|:---|:---|:---|:---|
  | threadpool_enabled       | 是       | boolean | \[ON,OFF\] | - ON：开启线程池。  - OFF：关闭线程池。   |
  | threadpool_oversubscribe | 是       | integer | \[1,50\]   | 每个线程组中最多能创建的额外线程数。                                                                                                                                                            |
  | threadpool_size          | 是       | integer | \[1,512\]  | 线程组数量。                                                                                                                                                                        |
     
  
- 查询线程池状态 通过**show status**命令查询线程池状态。
  ```
  show status like 'threadpool%';
  +------------------------------------+------------+
  | Variable_name                      | Value      |
  +------------------------------------+------------+
  | Threadpool_active_connections      | 65         | 
  | Threadpool_active_threads          | 5          | 
  | Threadpool_avg_launch_time         | 0          | 
  | Threadpool_dump_threads            | 0          | 
  | Threadpool_idle_threads            | 63         |
  | Threadpool_running                 | ON         | 
  | Threadpool_slow_launch_request     | 0          | 
  | Threadpool_threads                 | 237        | 
  | Threadpool_threads_high_water_mark | 1075       | 
  | Threadpool_waiting_threads         | 57         | 
  | Threadpool_worst_launch_time       | 692548     | 
  +------------------------------------+------------+
  ```
  表3线程池状态说明 
  | 状态                                 | 说明                        |
  |:---|:---|
  | Threadpool_active_connections      | 线程池中活跃连接数。                |
  | Threadpool_active_threads          | 线程池中活跃线程数。                |
  | Threadpool_avg_launch_time         | 平均等待时间（单位：毫秒）。            |
  | Threadpool_dump_threads            | dump线程数量。                 |
  | Threadpool_idle_thread             | 线程池空闲线程数。                 |
  | Threadpool_running                 | 线程池是否在运行。                 |
  | Threadpool_slow_launch_request     | 超过slow_launch_request的次数。 |
  | Threadpool_threads                 | 线程池总连接数。                  |
  | Threadpool_threads_high_water_mark | 历史高位线程数量。                 |
  | Threadpool_waiting_threads         | waiting线程池状态。             |
  | Threadpool_worst_launch_time       | 最坏启动时间（单位：毫秒）。            |
     
  
 
#### 性能测试
表4不同线程的性能测试 
| 模型                    | 线程   | 线程池开关是否开启 | QPS（每秒查询数） | latency（时延，单位是毫秒） |
|:---|:---|:---|:---|:---|
| oltp_update_non_index | 32   | 是         | 5932.47    | 7.84              |
| oltp_update_non_index | 64   | 是         | 10074.11   | 9.39              |
| oltp_update_non_index | 128  | 是         | 18079.61   | 10.65             |
| oltp_update_non_index | 256  | 是         | 27439.38   | 14.46             |
| oltp_update_non_index | 512  | 是         | 33007.96   | 28.16             |
| oltp_update_non_index | 1024 | 是         | 30282.13   | 51.94             |
| oltp_update_non_index | 2048 | 是         | 29836.86   | 95.81             |
   
