5.1.11.1 连接接口

本节介绍 MySQL 服务器如何 ManagementClient 端连接的各个方面。

网络接口和连接 Management 器线程

该服务器能够侦听多个网络接口上的 Client 端连接。连接 Management 器线程在服务器侦听的网络接口上处理 Client 端连接请求:

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

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

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

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

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

Client 端连接线程 Management

连接 Management 器线程将每个 Client 端连接与专用于该 Client 端连接的线程相关联,该线程处理身份验证并请求对该连接的处理。Management 器线程在必要时会创建一个新线程,但请先咨询线程高速缓存以查看其是否包含可用于连接的线程,以尝试避免这样做。连接结束时,如果高速缓存未满,则其线程将返回到线程高速缓存。

在此连接线程模型中,线程的数量与当前连接的 Client 端的数量一样多,这在服务器工作负载必须扩展以处理大量连接时具有一些缺点。例如,线程的创建和处理变得昂贵。另外,每个线程都需要服务器和内核资源,例如堆栈空间。为了容纳大量的同时连接,必须使每个线程的堆栈大小保持较小,从而导致其大小过小或服务器占用大量内存的情况。也可能会耗尽其他资源,并且调度开销可能会变得很大。

MySQL Enterprise Edition 包含一个线程池插件,该插件提供了另一种线程处理模型,旨在减少开销并提高性能。它实现了一个线程池,该线程池通过有效地 Management 大量 Client 端连接的语句执行线程来提高服务器性能。参见第 5.5.3 节“ MySQL 企业线程池”

为了控制和监视服务器如何 Management 处理 Client 端连接的线程,几个系统变量和状态变量是相关的。 (请参阅第 5.1.7 节“服务器系统变量”第 5.1.9 节“服务器状态变量”。)

  • thread_cache_size系统变量确定线程缓存的大小。默认情况下,服务器会在启动时自动调整该值的大小,但可以显式设置它以覆盖此默认值。值为 0 将禁用缓存,缓存将导致为每个新连接构建线程,并在连接终止时将其丢弃。要启用* N 非活动连接线程被缓存,请在服务器启动或运行时将thread_cache_size设置为 N *。与之关联的 Client 端连接终止时,连接线程将变为非活动状态。

  • 要监视缓存中的线程数以及由于无法从缓存中获取线程而创建了多少线程,请检查状态变量Threads_cachedThreads_created

  • 当线程堆栈太小时,这将限制服务器可以处理的 SQL 语句的复杂性,存储过程的递归深度以及其他消耗内存的操作。要为每个线程设置* N 字节的堆栈大小,请将thread_stack设置为 N *来启动服务器。

连接卷 Management

要控制服务器允许同时连接的最大 Client 端数,请在服务器启动时或运行时设置max_connections系统变量。如果更多的 Client 端尝试同时连接,则可能需要增加max_connections,然后将服务器配置为处理(请参阅B.4.2.6 节,“连接太多”)。

mysqld实际上允许max_connections 1 个 Client 端连接。保留额外的连接供具有SUPER特权的帐户使用。通过将特权授予 Management 员而不是普通用户(他们不需要),具有PROCESS特权的 Management 员可以连接到服务器并使用SHOW PROCESSLIST来诊断问题,即使连接了最大数量的非特权 Client 端也是如此。参见第 13.7.5.29 节“ SHOW PROCESSLIST 语句”

如果服务器由于达到max_connections限制而拒绝连接,则它将增加Connection_errors_max_connections status 变量。

MySQL 支持的最大连接数(即可以设置max_connections的最大值)取决于几个因素:

  • 给定平台上线程库的质量。

  • 可用的 RAM 量。

  • RAM 量用于每个连接。

  • 每个连接的工作负载。

  • 所需的响应时间。

  • 可用文件 Descriptors 的数量。

如果您有大量 GB 的可用 RAM,并且每个工作负载都很低或者响应时间目标不高,那么 Linux 或 Solaris 应该能够至少常规支持 500 至 1000 个同时连接,最多支持 10,000 个连接。

增大max_connections的值将增加mysqld所需的文件 Descriptors 的数量。如果所需的 Descriptors 数量不可用,则服务器将减小max_connections的值。有关文件 Descriptors 限制的 Comments,请参见第 8.4.3.1 节“ MySQL 如何打开和关闭 table”

可能需要增加open_files_limit系统变量,这也可能需要提高 os 对 MySQL 可以使用多少个文件 Descriptors 的限制。请查阅您的 os 文档,以确定是否可以增加限制以及如何增加限制。另请参见B.4.2.17 节,“找不到文件和类似错误”