本节描述 MySQL 服务器如何管理客户端连接的各个方面。
服务器能够侦听多个网络接口上的客户端连接。连接管理器线程处理服务器侦听的网络接口上的客户端连接请求:
在所有平台上,一个管理器线程处理 TCP/IP 连接请求。
在 Unix 上,同一个管理器线程还处理 Unix 套接字文件连接请求。
在 Windows 上,一个管理器线程处理共享内存连接请求,另一个管理器线程处理命名管道连接请求。
在所有平台上,可以启用一个额外的网络接口来接受管理 TCP/IP 连接请求。该接口可以使用处理“普通” TCP/IP 请求的管理器线程,或单独的线程。
服务器不会创建线程来处理它不监听的接口。例如,不支持命名管道连接的 Windows 服务器不会创建线程来处理它们。
各个服务器插件或组件可以实现自己的连接接口:
X 插件使 MySQL 服务器能够使用 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
status 变量。当线程堆栈太小时,这会限制服务器可以处理的 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
即使连接了最大数量的非特权客户端,管理员也可以连接到服务器并使用它来诊断问题。请参阅
第 13.7.7.29 节,“SHOW PROCESSLIST 语句”。
从 MySQL 8.0.14 开始,服务器还允许在管理网络接口上进行管理连接,您可以使用专用 IP 地址和端口进行设置。请参阅 第 5.1.12.2 节,“管理连接管理”。
Group Replication 插件使用内部会话与 MySQL Server 交互以执行 SQL API 操作。在 MySQL 8.0.18 版本中,这些会话计入
max_connections
服务器系统变量指定的客户端连接限制。max_connections
在这些版本中,如果服务器在启动组复制或尝试执行操作时达到
限制,则操作将失败,并且组复制或服务器本身可能会停止。从 MySQL 8.0.19 开始,Group Replication 的内部会话与客户端连接分开处理,因此它们不计入
max_connections
限制,如果服务器达到此限制也不会被拒绝。
MySQL 支持的最大客户端连接数(即
max_connections
可以设置的最大值)取决于几个因素:
给定平台上线程库的质量。
可用的 RAM 量。
每个连接使用的 RAM 量。
来自每个连接的工作负载。
所需的响应时间。
可用文件描述符的数量。
Linux 或 Solaris 通常应该能够支持至少 500 到 1000 个并发连接,如果您有许多 GB 的可用 RAM 并且每个连接的工作负载很低或响应时间目标要求不高,则最多可以支持 10,000 个连接。
增加该
值会增加mysqld需要max_connections
的文件描述符的数量
。如果所需数量的描述符不可用,则服务器会减少 的值
。有关文件描述符限制的评论,请参阅第 8.4.3.1 节,“MySQL 如何打开和关闭表”。
max_connections
增加
open_files_limit
系统变量可能是必要的,这也可能需要提高操作系统对 MySQL 可以使用多少文件描述符的限制。请查阅您的操作系统文档以确定是否可以增加限制以及如何增加限制。另见第 B.3.2.16 节,“未找到文件和类似错误”。