16_ProxySQL_Threads_01_主要的线程
备注:文章编写时间201904-201905期间,后续官方在github的更新没有被写入
~
~
ProxySQL的线程[ProxySQL Threads]
ProxySQL是多线程守护程序,每个模块有一个或多个线程。
以下是正常运行的线程列表:
一、Main thread
该线程仅负责引导核心模块并启动其他核心线程。
二、Admin thread
该线程负责以下内容:
1)它负责初始化和引导Admin interface;
2)它负责根据配置文件或数据库文件执行配置的初始加载;
3)如果启用,它可启动处理Web UI的HTTP服务器;
4)如果启用,则可配置群集模块;
5)它启动一个监听器,负责接受对Admin界面(Admin interface)发起的新连接,并为每个 admin/stats 连接创建一个新线程;
三、MySQL workers
mysql-threads 线程负责处理所有MySQL流量,所有客户端连接和所有后端连接。它实现为:几个线程处理任意数量的连接。MySQL工作线程会相同的端口上监听所有请求。
当一个新客户端连接时,一个MySQL工作线程将成功接受该连接并创建一个MySQL会话:MySQL会话/客户端绑定到该特定工作线程,直到客户端断开连接。换句话说,客户端连接成功后,其请求始终由同一个MySQL工作线程处理。
四、MySQL auxiliary threads
这些线程也称为"空闲线程"("idle threads")。
如果使用 --idle-threads 选项启动proxysql,则会为每个MySQL工作线程启动一个辅助线程。每个MySQL工作线程及其辅助线程将一起工作:第一个线程(主工作线程)负责处理活动连接,并将所有空闲连接分配给第二个线程(辅助线程),而第二个线程只等待空闲连接上发生事件(或超时),如果发生这种情况(由空闲边活跃),则将它们传回第一个线程。
当活动客户端连接数与空闲客户端连接数相比非常小时,建议使用"空闲线程"("idle threads")。通过这样的方式,可以使ProxySQL处理数十万个连接(测试多达100万个连接)。
五、HTTP server (new in 1.4.4)
ProxySQL有一个使用了 libmicrohttpd 的内置HTTP服务器。请为其配置 MHD_USE_INTERNAL_POLLING_THREAD 参数,因此它可能使用到多个线程。
六、Cluster threads (new in 1.4.2)
对于ProxySQL群集中的每个ProxySQL节点,需要为他们每一个启动一个线程并仅负责管理一个与他们自己相对应得同伴实例(对等体)。如果添加或删除了节点,则线程数可以动态增加或减少。
七、Query Cache purge thread
此线程充当查询缓存的垃圾收集器。垃圾收集器用于确保对不在服务通道中得数据(客户端正在等待回复得链路数据)执行清除。
八、ClickHouse Server thread (new in 1.4.3)
如果启用了ClickHouse Server(如果编译了对ClickHouse的支持,并且使用--clickhouse-server启动了proxysql),则此线程负责以下内容:
1)它负责初始化ClickHouse模块;
2)它启动一个监听器,负责接受新连接,并为每个想要访问ClickHouse的客户端连接创建一个新线程。
九、SQLite3 Server thread (new in 1.4.3)
如果启用了SQLite3 Server(proxysql以--sqlite3-server启动),则此线程负责以下内容:
1)它负责初始化SQLite3服务器模块;
2)它启动一个监听器,负责接受新连接并为每个想要访问内置SQLite3服务器的客户端连接创建一个新线程;
十、Monitor threads
Monitor模块启动了多个线程。
它的实现在过去发生了些变化,造成有些版本减少了线程数量,有些版本中增加了线程数量。
在ProxySQL 1.4中,Monitor模块启动的线程有如下这些:
1)一个主要的线程负责为每个监视器类别启动一个线程(总共5个);
2)一个线程调度负责连接的检查;
3)一个线程调度负责ping检查;
4)一个线程调度负责read-only检查;
5)一个线程调度负责复制延时检查;
6)一个线程调度负责组复制监控;
7)还有一个线程池(最初大小是mysql-threads大小的两倍);
线程池负责执行由调度线程调度的所有检查和监视。线程池的大小可以根据监视器队列中的待检查数的多少自动增长和缩小。相同的线程还负责根据检查结果立即采取措施,例如避开节点或重新配置主机组。
十一、Note on CPU usage
上面列出的线程具有非常不同的CPU使用情况。
通常,MySQL工作线程是最繁忙的线程,负责大部分CPU使用。而其他线程的CPU使用率非常低,但如果ProxySQL必须检查数百或数千台服务器,则Monitor模块可能会大幅增加Monitor线程池的大小。
继而使得Monitor线程大量增加,导致它们使用的了大量的CPU资源。
~
~
完毕!