本节介绍 MySQL 服务器如何管理客户端连接的各个方面。
服务器能够监听多个网络接口上的客户端连接。连接管理器线程处理服务器监听的网络接口上的客户端连接请求。
在所有平台上,一个管理器线程处理 TCP/IP 连接请求。
在 Unix 上,同一个管理器线程还处理 Unix 套接字文件连接请求。
在 Windows 上,一个管理器线程处理共享内存连接请求,另一个处理命名管道连接请求。
在所有平台上,可能会启用一个额外的网络接口来接受管理 TCP/IP 连接请求。此接口可以使用处理“普通” TCP/IP 请求的管理器线程,也可以使用单独的线程。
服务器不会创建线程来处理它不监听的接口。例如,没有启用命名管道连接支持的 Windows 服务器不会创建线程来处理它们。
单独的服务器插件或组件可能会实现自己的连接接口。
X 插件使 MySQL 服务器能够使用 X 协议与客户端通信。请参见第 22.5 节,“X 插件”.
连接管理器线程将每个客户端连接与专门用于它的线程相关联,该线程处理该连接的认证和请求处理。管理器线程在需要时创建新线程,但尝试通过首先查询线程缓存来避免这样做,以查看缓存中是否包含可用于连接的线程。当连接结束时,如果缓存未满,则其线程将返回到线程缓存。
在此连接线程模型中,与当前连接的客户端数量一样多的线程,这在服务器工作负载必须扩展以处理大量连接时有一些缺点。例如,线程创建和销毁变得很昂贵。此外,每个线程都需要服务器和内核资源,例如堆栈空间。为了容纳大量同时连接,每个线程的堆栈大小必须保持较小,这会导致堆栈大小要么太小,要么服务器消耗大量内存。其他资源的枯竭也会发生,调度开销也会变得很大。
MySQL 企业版包含一个线程池插件,它提供了一种旨在降低开销并提高性能的替代线程处理模型。它实现了一个线程池,通过有效地管理大量客户端连接的语句执行线程,从而提高服务器性能。请参见第 7.6.3 节,“MySQL 企业版线程池”.
为了控制和监控服务器如何管理处理客户端连接的线程,几个系统和状态变量是相关的。(请参见第 7.1.8 节,“服务器系统变量”,以及第 7.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.3.2.5 节,“太多连接”)。如果服务器拒绝连接,因为达到了 max_connections
限制,它将递增 Connection_errors_max_connections
状态变量。
mysqld 实际上允许 max_connections
+ 1 个客户端连接。额外的连接保留给拥有 CONNECTION_ADMIN
权限(或已弃用的 SUPER
权限)的帐户使用。通过向管理员授予权限,而不对普通用户(他们不应该需要它)授予权限,管理员可以连接到服务器并使用 SHOW PROCESSLIST
来诊断问题,即使最大数量的非特权客户端已连接。参见 第 15.7.7.30 节,“SHOW PROCESSLIST 语句”。
服务器还在管理网络接口上允许管理连接,您可以使用专用 IP 地址和端口设置它。参见 第 7.1.12.2 节,“管理连接管理”。
组复制插件使用内部会话与 MySQL 服务器交互,以执行 SQL API 操作。组复制的内部会话与客户端连接分开处理,因此它们不会计入 max_connections
限制,如果服务器达到了此限制,也不会被拒绝。
MySQL 支持的最大客户端连接数(即可以设置 max_connections
的最大值)取决于几个因素
给定平台上线程库的质量。
可用的 RAM 数量。
每个连接使用的 RAM 数量。
每个连接的工作负载。
期望的响应时间。
可用的文件描述符数量。
Linux 或 Solaris 通常应该能够支持至少 500 到 1000 个同时连接,如果您可以使用多个 GB 的 RAM 并且每个连接的工作负载很低或响应时间目标不高,则最多可以支持 10,000 个连接。
增加 max_connections
值会增加 mysqld 所需的文件描述符数量。如果所需的描述符数量不可用,服务器将减少 max_connections
的值。有关文件描述符限制的说明,请参见 第 10.4.3.1 节,“MySQL 如何打开和关闭表”。
可能需要增加 open_files_limit
系统变量,这也可能需要提高操作系统对 MySQL 可以使用多少个文件描述符的限制。请参阅您的操作系统文档以确定是否可以增加限制以及如何增加限制。另请参见 第 B.3.2.16 节,“找不到文件和类似错误”。