Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

7.1.12.1 连接接口

本节描述了 MySQL 服务器管理客户端连接的方面。

网络接口和连接管理线程

服务器可以在多个网络接口上监听客户端连接。连接管理线程处理网络接口上的客户端连接请求:

  • 在所有平台上,一个管理线程处理 TCP/IP 连接请求。

  • 在 Unix 上,同一个管理线程也处理 Unix 套接字文件连接请求。

  • 在 Windows 上,一个管理线程处理共享内存连接请求,另一个处理命名管道连接请求。

  • 在所有平台上,可能启用一个额外的网络接口来接受管理性 TCP/IP 连接请求。该接口可以使用处理普通 TCP/IP 请求的管理线程,或者是一个单独的线程。

服务器不会创建线程来处理它不监听的接口。例如,一个没有启用命名管道连接支持的 Windows 服务器不会创建一个线程来处理它们。

单个服务器插件或组件可能实现自己的连接接口:

客户端连接线程管理

连接管理线程将每个客户端连接与一个专门的线程关联,该线程处理该连接的身份验证和请求处理。当连接结束时,其线程将返回到线程缓存中,如果缓存不满。

在这个连接线程模型中,当前连接的客户端数量与线程数量相同,这在服务器工作负载需要扩展以处理大量连接时存在一些缺点。例如,线程创建和销毁变得昂贵。此外,每个线程都需要服务器和内核资源,如堆栈空间。为了容纳大量同时连接,线程堆栈大小必须保持小,以免服务器消耗大量内存。此外,其他资源也可能会耗尽,调度开销也可能变得很大。

MySQL Enterprise Edition 包括一个线程池插件,该插件提供了一种替代的线程处理模型,旨在减少开销和提高性能。它实现了一个线程池,以高效地管理大量客户端连接的语句执行线程。请参阅 第 7.6.3 节,“MySQL 企业线程池”

要控制和监控服务器如何管理处理客户端连接的线程, several 系统和状态变量是相关的。(请参阅 第 7.1.8 节,“服务器系统变量”第 7.1.10 节,“服务器状态变量”。)

  • 系统变量 thread_cache_size 确定线程缓存大小。默认情况下,服务器在启动时自动调整该值,但可以明确设置以覆盖默认值。如果将其设置为 0,将禁用缓存,每个新连接将设置一个线程,并在连接终止时销毁线程。要启用 N 闲置连接线程的缓存,请在服务器启动时或运行时将 thread_cache_size 设置为 N。连接线程在客户端连接终止时变为闲置。

  • 要监控缓存中的线程数量和创建的线程数量,因为无法从缓存中获取线程,请检查 Threads_cachedThreads_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节,“文件未找到和类似错误”