1.1.10 线程池

谈到数据库池(Pool),大家最熟悉的应该是缓冲池(Buffer Pool);如果谈到与数据库连接相关的池,可能最容易想到的是连接池(Connection Pool)。实际上,Oracle的MySQL企业版有一个核心卖点就是线程池(Thread Pool),而RDS for MySQL已经带了这个功能。

线程池的主要作用就是当连接非常多时,能够强迫这些连接在线程池中排队,从而避免数据库被突发的“洪水”流量打爆。前面1.1.1节阐述的自旋锁引发的竞争例子,正是在独占线程的场景下发生的。

在正常场景下,我们发现连接池的效率要高于普通线程响应模型的效率,这是因为针对不同的请求做了级别设置,尽可能避免复杂查询争用。

这里主要有三个核心参数,分别是thread_pool_enabled、thread_pool_size和thread_pool_oversubscribe,它们分别对应于连接池功能的启停、连接池分组的数量和每个分组的活跃线程数。这里的活跃线程,指的是有实际任务需要MySQL线程响应处理的(pick up),而非等待I/O的任务或等待事务提交的任务。

我们也做了一些常规的Sysbench压测,压测数据如图1-9所示。要了解更多压测数据,可以参考阿里云的官方文档,这里不再赘述。

图1-9 线程池压测数据