mysql数据库连接池设置多少,线程池参数如何设置
线程池是数据库系统的一项非常重要的功能,但MySQL社区版不包含线程池功能。 然而,幸运的是,MySQL的Percona版本提供了这一功能。 此外,MySQL企业版还提供了线程池。 在性价比方面,Percona显然更具吸引力。 由于是开源且免费的,有关Percona版线程池的参数将在后面介绍。
Percona MySQL线程池相关参数:
thread_pool_max_threads :默认值100000,线程池中的最大线程数。
thread_pool_size :设置线程池中线程组的数量。 默认值为服务器CPU的核心数。 分组的目的是将每个组与每个CPU核心相对应,以便每个组在同一时间点调用和执行一个线程。
thread_pool_oversubscribe :默认值为3,控制一个CPU内核同时活动的线程数。 类似于“超频”的概念。 线程组中运行的线程数表明,值越大,同一时间可以执行越多的线程。 如果该值小于3,则会导致频繁的线程休眠和唤醒。
thread_pool_stall_limit :如果线程池中没有线程,thread_pool_stall_limit将确定等待多久才能创建新线程(以毫秒为单位)。 默认值为500。
在适当的范围内,该值越大,线程越少,从而提高了整个MySQL服务器的处理性能并降低了系统资源的利用率。 但是,该值越大,创建新线程的时间就越长,用户查询的延迟就越明显,因此并不是越大越好。
thread_pool_idle_timeout :默认值为60秒,空闲线程空闲后需要多长时间才能结束?
thread_pool_high_prio_tickets :默认值4294967295。 控制高优先级队列策略,并控制为每个新连接授予的tickets大小。 如果此值设置为0,则无法进入优先级较高的队列。
thread_pool_high_prio_mode :取值的范围transactions、statements、none。 默认值transactions。 此参数更好地控制连接到高优先级队列的每个连接。
线程池组中的挂起任务将置于任务队列中,等待工作器线程处理。
每个组有两个队列:高优先级队列和普通队列,工作器线程首先从高优先级队列中进行事件处理,只有在高优先级队列为空时才从普通队列中进行事件处理。
使用首选队列,可以优先处理已经打开的事务和较短的事务,并及时发送解锁等资源。
此参数可以设置以下三种模式:
transactions :默认情况下,如果事务只有一个已打开的SQL,而thread_pool_high_prio_tickets不为0,则为thread _ pool _ higkets none :禁用高优先级队列功能,并将所有连接放入普通队列进行处理。 Percona MySQL线程池相关状态变量:
Threadpool_idle_threads :显示线程池中的空闲线程数。 Threadpool_threads :表示线程池中的所有线程数。 线程池处理策略
线程池查找并处理新连接。 应用检查高优先级队列和检查常规队列(如果为空)的策略。 对于已经启动的事务,后续执行事件将排在高优先级队列中执行。 当tickets为0时,连接将进入常规队列。
thread_pool_high_prio_mode参数的引入表明,无论是包含多个sql的事务执行还是自动提交,所有sql语句都将快速执行以解决特定场景,如特定连接有些连接还要求特定连接具有低优先级的自己的sql,例如监视类连接。
有一个场景可以在高并发条件下限制线程池的性能,从而导致死锁。 在高并发条件下,线程池中的活动线程达到thread_pool_oversubscribe限制,但所有或大部分这些活动线程正在等待锁定。 锁的所有者不在线程池中。 线程池中的活动线程和等待锁定的线程将累积起来,最终达到thread_pool_max_threads限制,导致性能下降。 此外,如果发现此时具有锁定的连接已调度到连接池,并且无法创建更多线程,则会发生死锁,具有锁定的连接将解锁并回滚事务。 此方案的解决方案是在活动线程达到thread_pool_oversubscribe限制时,在处理已经启动的事务之前不启动新事务或创建新线程
MySQL