本节介绍 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 节,“找不到文件和类似错误”。