2019独角兽企业重金招聘Python工程师标准>>>
一、"Thread pool in MariaDB 5.5"
线程池解决的问题:
传统mysql使用一个线程处理一个客户端连接,如果许多的并发用户,将使性能下降。因为大量的线程将引起上下文交换,cpu缓存失效,增加锁争用。一个理想的解决方案是减少上下文交换,维持低数量的线程数。同时为了充分利用CPU,理想的应该维持每个CPU处理一个活动线程。
mariadb 5.1线程池是一个静态的线程数。
mariadb 5.5实现以下情况:
1、动态池,随需求增加和减少;
2、 维护线程池本身只需 最小的开销;
3、充分利用底层操作系统的能力,如果系统支持,使用原生的OS线程池,使用更好的I/O复用方法;
4、限制线程资源利用(thread_pool_max_threads);
什么时候使用线程池:
查询相对短,CPU负载型(如OLTP)。
以下情况使用线程池效益不太好:
1、非常突发的工作负载(长期不活跃混合许多 短期 高活动的 用户 ),同时不能忍受延时;
2、许多并发,长,不屈服的查询,如数据仓库;
3、总是依赖简单查询很快;
启用线程池:
添加thread_handling=pool-of-threads到my.cnf文件,windows默认开启
线程池变量:
thread_pool_size:多少个线程组,默认为处理器个数。意味着能同时运行的线程数。划分所有客户端连接到组,每个组一个运行线程。
thread_pool_stall_limit:一个运行线程被认为是失速的毫秒数。默认是500,如果到达时间,线程池将唤醒或建立一个另外的线程。如果线程数到达thread_pool_max_threads,将不再创建进程。
thread_pool_max_threads:线程池中最大线程数,如果到达该值,将不创建新线程,默认为500;
thread_pool_idle_timeout:一个空闲工作线程退出之前等待秒数,默认为60,
thread_pool_oversubscribe:内部参数,默认3。高的值,更多线程能同时运行。低的值将导致更多的睡眠和唤醒。
监控线程池活动:
threadpool_threads:池中的线程数;
threadpool_idle_threads:池中不活跃线程数量,空闲可能是等待新的工作,或者因磁盘io、行或表锁等。
Mariadb线程池与Mysql企业版线程池:
相似之处:
1、划分客户端连接到组,thread_pool_size控制线程池组的大小;
2、使用相同的方式检测线程是否变速,使用同样的参数thread_pool_stall_limit进行控制,mariadb单位为毫秒,mysql企业版为10ms单位。
不同之处:
1、windows实现完全不同,mariadb使用原生windows线程池;
2、mariadb使用每个操作系统更有效的I/O复用功能,如linux使用epoll;
3、mariadb没有限制并发事务;
4、mariadb线程池是内建功能,而不是插件;
为了避免所有工作线程都在忙,因行/表锁,新的连接不能创建,不能登录到mysql服务,找出问题所在,并kill掉查询,mysqld提供两个新的选项:
--extra-port:默认为0,不为0时,能连接max_connections数量的正常线程和1个额外的SUPER用户通过extra-port TCP/IP端口,使用传统的一个连接对应一个线程方式。
--extra-max-connections:默认1,支持一个额外的连接。
连接方式:mysql --port='number-of-extra-port' --protocol=tcp
当使用线程池时,thread_cache_size变量不使用,Threads_cached状态变量将为0。
二、"Thread Pool"
从5.5.29-30.0开始支持线程池,percona线程池也是内建版本,非插件,参考mariadb线程池实现方式,以及进行了优化,添加了优先级队列,与mysql官方不同的是没有限制并发事务。
优先连接调度:
虽然线程池限制了并发查询数量,而打开的事务可能很高,大量的打开事务将影响当前运行的查询, 使用thread_pool_high_prio_tickets控制高优先级队列,给每个连接分配多少票,以进入到高优先级队列。每次从高优先级队列取新连接处理,如果高优先级队列为空时,才从普通队列取。
可以减少打开的事务,有益于短事务快速提交,默认线程池总是将已经开始的事务放到高优先级队列。如果值为0,所有连接将总是放到普通队列。
低优先级队列限制:
通过thread_pool_max_threads限制线程池中活动和等待线程的数量,不启动新事务和创建新线程,直到已经开始处理事务,以免过多的活动线程达到超额,影响服务器性能。
特殊变量:
thread_pool_high_prio_mode:提供细粒度的控制高优先级队列,支持全局和每个连接。默认值 transactions,仅当语句从已经开始的事务可能进入到高优先级队列,并依赖于当前连接拥有的高优先级票。statements,所有独立的语句进入到高优先级队列,不管连接事务状态和 拥有的高优先级票;none,关闭高优先级队列,如监控连接,以免影响其他连接的性能。
thread_pool_high_prio_tickets:控制高优先级队列行为,每个新连接分配这么多的高优先级票,设置为0关闭高优先级队列。
参考:
1、"Thread pool in MariaDB 5.5": https://mariadb.com/kb/en/mariadb/mariadb-documentation/optimization-and-tuning/buffers-caches-and-threads/thread-pool/threadpool-in-55/
2、"Thread Pool": http://www.percona.com/doc/percona-server/5.5/performance/threadpool.html
来自为知笔记(Wiz)