7.1.12.1 连接接口
本节描述了 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
系统变量。如果更多客户端尝试同时连接,而服务器配置无法处理(见第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节,“管理连接管理”。
集团复制插件使用内部会话来执行 SQL API 操作。集团复制的内部会话与客户端连接分开处理,所以它们不计入 max_connections
限制,并且不会被拒绝如果服务器已经达到这个限制。
MySQL 支持的客户端连接数的最大值(即max_connections
可以设置的最大值)取决于多个因素:
-
给定平台上的线程库质量。
-
可用的内存大小。
-
每个连接所占用内存大小。
-
每个连接的工作负载。
-
期望响应时间。
-
文件描述符数量。
Linux 或 Solaris 应该可以支持至少 500 到 1000 个同时连接,并且如果有许多 GB 的内存可用且每个连接的工作负载很低或响应时间目标不高,可以支持多达 10,000 个连接。
增加max_connections
值将使 mysqld 需要更多的文件描述符。如果所需的描述符数量不可用,服务器将减少max_connections
的值。关于文件描述符限制的注释,请参见第 10.4.3.1 节,“MySQL 打开和关闭表”。
可能需要增加open_files_limit
系统变量,可能还需要提高操作系统对MySQL的文件描述符使用限制。请查看您的操作系统文档,以确定是否可以增加限制并如何实现。另外,请参阅第B.3.2.16节,“文件找不到和类似错误”。