本节描述了 MySQL 服务器管理客户端连接的方面。
服务器可以在多个网络接口上监听客户端连接。连接管理线程处理网络接口上的客户端连接请求:
-
在所有平台上,一个管理线程处理 TCP/IP 连接请求。
-
在 Unix 上,同一个管理线程也处理 Unix 套接字文件连接请求。
-
在 Windows 上,一个管理线程处理共享内存连接请求,另一个处理命名管道连接请求。
-
在所有平台上,可能启用一个额外的网络接口来接受管理性 TCP/IP 连接请求。该接口可以使用处理普通 TCP/IP 请求的管理线程,或者是一个单独的线程。
服务器不会创建线程来处理它不监听的接口。例如,一个没有启用命名管道连接支持的 Windows 服务器不会创建一个线程来处理它们。
单个服务器插件或组件可能实现自己的连接接口:
-
X 插件使 MySQL 服务器可以使用 X 协议与客户端通信。见 第 22.5 节,“X 插件”。
连接管理线程将每个客户端连接与一个专门的线程关联,该线程处理该连接的身份验证和请求处理。当连接结束时,其线程将返回到线程缓存中,如果缓存不满。
在这个连接线程模型中,当前连接的客户端数量与线程数量相同,这在服务器工作负载需要扩展以处理大量连接时存在一些缺点。例如,线程创建和销毁变得昂贵。此外,每个线程都需要服务器和内核资源,如堆栈空间。为了容纳大量同时连接,线程堆栈大小必须保持小,以免服务器消耗大量内存。此外,其他资源也可能会耗尽,调度开销也可能变得很大。
MySQL Enterprise Edition 包括一个线程池插件,该插件提供了一种替代的线程处理模型,旨在减少开销和提高性能。它实现了一个线程池,以高效地管理大量客户端连接的语句执行线程。请参阅 第 7.6.3 节,“MySQL 企业线程池”。
要控制和监控服务器如何管理处理客户端连接的线程, several 系统和状态变量是相关的。(请参阅 第 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
系统变量。如果更多客户端尝试同时连接超过服务器配置的处理能力(见第 B.3.2.5 节,“太多连接”),则可能需要增加max_connections
。如果服务器由于达到max_connections
限制而拒绝连接,则它将增加Connection_errors_max_connections
状态变量。
mysqld实际上允许max_connections
+ 1 个客户端连接。额外的连接保留供具有CONNECTION_ADMIN
特权(或已弃用的SUPER
特权)的账户使用。通过授予管理员特权而不是普通用户(他们不需要它),管理员可以连接到服务器并使用SHOW PROCESSLIST
诊断问题,即使最大数量的非特权客户端连接。见第 15.7.7.31 节,“SHOW PROCESSLIST 语句”。
服务器还允许在管理网络接口上进行管理连接,您可以使用专用 IP 地址和端口设置。见第 7.1.12.2 节,“管理连接管理”。
Group Replication 插件使用内部会话与 MySQL 服务器交互,以执行 SQL API 操作。Group Replication 的内部会话单独处理,不计入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节,“文件未找到和类似错误”。