本节介绍MySQL服务器如何管理客户端连接的各个方面。
网络接口和连接管理器线程
客户端连接线程管理
连接卷管理
网络接口和连接管理器线程
该服务器能够侦听多个网络接口上的客户端连接。连接管理器线程处理服务器侦听的网络接口上的客户端连接请求:
在所有平台上,一个管理器线程可处理TCP / IP连接请求。
在Unix上,同一管理器线程也处理Unix套接字文件连接请求。
在Windows上,管理器线程处理共享内存连接请求,另一个管理器处理命名管道连接请求。
在所有平台上,可以启用其他网络接口以接受管理TCP / IP连接请求。该接口可以使用管理“ 普通 ” TCP / IP请求的管理器线程,也可以使用单独的线程。
服务器不会创建线程来处理它不监听的接口。例如,不支持命名管道连接的Windows服务器不会创建线程来处理它们。
各个服务器插件或组件可以实现自己的连接接口:
X插件使MySQL Server可以使用X协议与客户端进行通信。请参见第20.5节“ X插件”。
客户端连接线程管理
连接管理器线程将每个客户端连接与专用于该客户端连接的线程相关联,该线程处理身份验证并请求对该连接的处理。管理器线程在必要时会创建一个新线程,但请尝试先咨询线程高速缓存以查看其是否包含可用于连接的线程,从而避免这样做。连接结束时,如果高速缓存未满,则其线程将返回到线程高速缓存。
在此连接线程模型中,线程数量与当前连接的客户端数量一样多,当服务器工作负载必须扩展以处理大量连接时,这具有一些缺点。例如,线程的创建和处理变得昂贵。另外,每个线程都需要服务器和内核资源,例如堆栈空间。为了容纳大量的同时连接,必须使每个线程的堆栈大小保持较小,从而导致其大小过小或服务器占用大量内存的情况。也可能会耗尽其他资源,并且调度开销可能会变得很大。
MySQL Enterprise Edition包含一个线程池插件,该插件提供了另一种线程处理模型,旨在减少开销并提高性能。它实现了一个线程池,该线程池通过有效地管理大量客户端连接的语句执行线程来提高服务器性能。请参见 第5.6.3节“ MySQL企业线程池”。
为了控制和监视服务器如何管理处理客户端连接的线程,几个系统变量和状态变量是相关的。(请参见第5.1.8节“服务器系统变量”和第5.1.10节“服务器状态变量”。)
所述thread_cache_size 系统变量确定线程缓存大小。默认情况下,服务器会在启动时自动调整该值的大小,但是可以显式设置它以覆盖此默认值。值为0将禁用缓存,这将导致为每个新连接设置一个线程,并在连接终止时将其丢弃。要启用对N 非活动连接线程的缓存,thread_cache_size请N在服务器启动时或运行时将其设置 为 。与之关联的客户端连接终止时,连接线程将变为非活动状态。
要监视高速缓存中的线程数以及由于无法从高速缓存中获取线程而创建了多少线程,请检查 Threads_cached和 Threads_created状态变量。
当线程堆栈太小时,这将限制服务器可以处理的SQL语句的复杂性,存储过程的递归深度以及其他消耗内存的操作。要N为每个线程设置字节的堆栈大小 ,请将服务器thread_stack设置为来 启动服务器 N。
连接卷管理
要控制服务器允许同时连接的最大客户端数,请max_connections在服务器启动或运行时设置 系统变量。max_connections 如果更多的客户端尝试同时连接,然后将服务器配置为可以处理,则可能有必要增加(请参见 第B.4.2.6节“连接太多”)。如果服务器由于max_connections达到限制而拒绝连接 ,则它将增加 Connection_errors_max_connections 状态变量。
mysqld实际上允许 max_connections + 1个客户端连接。保留额外的连接,以供具有CONNECTION_ADMIN特权(或不建议使用的SUPER 特权)的帐户 使用。通过将特权授予管理员而不是普通用户(不需要该特权),即使连接SHOW PROCESSLIST了最大数量的非特权客户端,管理员也可以连接到服务器并用于诊断问题。请参见 第13.7.7.29节“ SHOW PROCESSLIST语句”。
从MySQL 8.0.14开始,服务器还允许在管理网络接口上进行管理连接,您可以使用专用IP地址和端口进行设置。请参见 第5.1.12.2节“管理连接管理”。
组复制插件使用内部会话与MySQL Server交互以执行SQL API操作。在MySQL 8.0.18发行版中,这些会话计入max_connections服务器系统变量指定的客户端连接限制 。在这些版本中,如果max_connections启动组复制或尝试执行操作时服务器已达到 限制,则该操作将失败,并且组复制或服务器本身可能会停止。从MySQL 8.0.19开始,组复制的内部会话与客户端连接分开处理,因此它们不计入 max_connections限制,并且如果服务器达到此限制,则不会被拒绝。
MySQL支持的最大客户端连接数(即max_connections可以设置的最大值 )取决于几个因素:
给定平台上线程库的质量。
可用的RAM量。
RAM量用于每个连接。
每个连接的工作负载。
所需的响应时间。
可用文件描述符的数量。
如果您有大量GB的可用RAM,并且每个工作负载都很低或者响应时间目标不高,那么Linux或Solaris应该能够至少日常支持500至1000个同时连接,最多支持10,000个连接。
增大该 max_connections值会增加mysqld所需的文件描述符的数量 。如果所需数目的描述符不可用,则服务器将减少的值 max_connections。有关文件描述符限制的注释,请参见第8.4.3.1节“ MySQL如何打开和关闭表”。
open_files_limit可能需要 增加 系统变量,这可能还需要提高操作系统对MySQL可以使用多少个文件描述符的限制。请查阅您的操作系统文档,以确定是否可以增加限制以及如何增加限制。另请参见第B.4.2.17节“找不到文件和类似错误”。




