mysql连接池问题

时间:2022-09-19 22:56:44

http://mikaelronstrom.blogspot.com/2011/10/mysql-thread-pool-summary.html

Mysql 插件thead pool plugin的作者博客;描述了thead pool的详细设计理念




mysql pool:多个连接复用一个thread。
看了半天,accept是由一个单独的mysql主线程来完成,epollcntrl/epollwait + read + processs + write是在pool中完成的。初步看起来,accept不会被epoll + read + process + write给hang住。因为使用了epoll复用多个连接,线程切换/创建/销毁的代价减少了。

MariaDB线程池源码分析 http://ourmysql.com/archives/1303 mariadb 5.5 threadpool 源码分析  http://blog.chinaunix.net/uid-28364803-id-3431242.html http://blog.chinaunix.net/uid-28364803-id-3427833.html Oracle Mysql Thread pool的安装和原理 http://get.jobdeer.com/907.get

8.11.6 The Thread Pool Plugin

http://dev.mysql.com/doc/refman/5.6/en/thread-pool-plugin.html

与pool对立的是one-thread-per-connection,是指针对每个连接创建一个线程来处理这个连接的所有请求,直到连接断开,线程结束.这也是thread_handling的默认值。 由此可见,默认情况下,多少连接就会产生多少个线程,并发越大,线程越多,线程之间的资源竞争越激烈,性能越低。

server的主监听线程监听到有客户端的connect时,会调用tp_add_connection函数进行处理。
首先根据thread_id对group_count取模,找到其所属的group,然后调用queue_put将此connection
放入到group中的queue中。



0  小结

MariaDB的thread pool的实现相对比较简单,总体上就是将group中所有的connection的socket挂在
group的epoll_fd上进行事件监听,监听到的事件或被当前线程执行,或者被push到group的queue上
被其他线程执行。

监控线程timer_thread定期的根据需要去唤醒等待线程或创建新的线程,来达到动态增加的thread的
目的。而thread的收缩则是通过线程等待事件超时来完成的。