首先明确调优的目的是提高TPS。
thread_pool_size:
是一个非常重要的参数,控制thread pool的性能,具体表现为thread group的数量。只能在server启动之前设置,我们测试thread pool的结果如下:
*如果主存储引擎是innodb,thread_pool_size设置在16至36之间,大多数情况设置在24到36,我们还没有发现什么情况需要设置超过36,也只有一些特殊的环境需要设置小于16.
使用DBT2或者sysbench做测试的时候,innodb引擎下通常设置为36个,如果在一些写入特别多的环境,这个值可以设置的更小一些。
*如果主存储引擎是myisam,thread_pool_size需要设置的更低,我们推荐的值是4到8,更高的值可能会对性能有负面影响。
thread_pool_stall_limit:
这个参数对于处理阻塞和长时间执行的语句很重要。这个时间是从一个statement从开始执行到执行完成总花费的时间,如果超过设置值就被认定为stalled,此时线程池也开始允许执行另外
一个statement。这个值的单位是10毫秒,默认值是6,也就是默认间隔是60ms,一个statement执行超过60ms,就被认为是stalled。最大值是600,也就是6秒。一般这个值设置为你99%的statement可以执行完的时间。比如我慢查询设置的
是0.1,那么这里就设置为10。另外可以通过
SELECT SUM(STALLED_QUERIES_EXECUTED) / SUM(QUERIES_EXECUTED) FROM information_schema.TP_THREAD_GROUP_STATS;来获取stalled的比例,这个值尽量的小,为了避免stall,可以调高thread_pool_stall_limit的值。
thread_pool_prio_kickup_timer:
这个值影响低优先级的statements的queue。参数值的单位是毫秒,低优先级的statement需要等到多少毫秒才能被移动到高优先级的queue.默认是1000,也就是1秒,值的范围是(0-4294967294)。
thread_pool_high_priority_connection:
这个参数主要决定新来的statements的执行优先级。默认值是0,表示同时使用low-prority queue和high-priority queue。如果设置为1,所有的statement都会分配到high-priority queue。
thread_pool_max_unused_threads:
这个参数限制thread pool中sleeping thread的最大数量。从而限制sleeping thread对内存的使用。
如果参数的值为0,也就是默认值,意味着对sleeping thread没有限制.假设值为N,当N大于0的时候,意味着1个consumer thread和N-1个 reserve thread。意思也就是说,当一个线程执行完一个statement,将要转为sleeping状态的时候,这时sleeping状态的
线程数量已经达到了允许的sleeping thread的最大数量,那么这个线程将会退出。
关于consumer thread:sleeping thread由consumer thread和reserve thread组成,thread pool允许sleeping thread中有一个consumer thread,一个thread要转变为sleepling thread的时候,如果没有consumer thread 存在,那么
这个thread将转变为consumer thread.当一个sleeping thread要被唤醒的时候,如果存在consumer thread,那么优先唤醒consumer thread,如果consumer thread不存在,那么唤醒reserve thread。
thread_pool_algorithm:
此参数决定thread pool使用那种算法.默认值是0,表示使用较低的并发算法,在大多数测试和生产环境下效果很好。
另外一个值是1,更加积极的增加并发数量的算法,有时候会比最佳线程数量性能更好,但是随着连接的增加,性能会逐渐下降。所以这个参数主要用在实验环境。