#### 5.1.12.1 连接接口

[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)

本节描述 MySQL 服务器如何管理客户端连接的各个方面。

-   [网络接口和连接管理器线程](connection-interfaces.html#connection-interfaces-interfaces)

-   [客户端连接线程管理](connection-interfaces.html#connection-interfaces-thread-management)

-   [连接卷管理](connection-interfaces.html#connection-interfaces-volume-management)

##### 网络接口和连接管理器线程

服务器能够侦听多个网络接口上的客户端连接。连接管理器线程在服务器侦听的网络接口上处理客户端连接请求：

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

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

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

-   在所有平台上，可以启用额外的网络接口来接受管理 TCP/IP 连接请求。此接口可以使用处理“普通”TCP/IP 请求的管理器线程，也可以使用单独的线程。

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

    单独的服务器插件或组件可以实现自己的连接接口：

-   X Plugin 使 MySQL 服务器能够使用 X 协议与客户端通信。看[第 20.5 节，“X 插件”](x-plugin.html).

##### 客户端连接线程管理

连接管理器线程将每个客户端连接与专用于它的线程相关联，该线程处理该连接的身份验证和请求处理。管理器线程在必要时创建一个新线程，但通过首先查询线程缓存以查看它是否包含可用于连接的线程来避免这样做。当连接结束时，如果缓存未满，则将其线程返回到线程缓存。

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

MySQL 企业版包括一个线程池插件，它提供了一种替代线程处理模型，旨在减少开销并提高性能。它实现了一个线程池，通过有效地管理大量客户端连接的语句执行线程来提高服务器性能。看[第 5.6.3 节，“MySQL 企业线程池”](thread-pool.html).

为了控制和监视服务器如何管理处理客户端连接的线程，一些系统和状态变量是相关的。（看[第 5.1.8 节，“服务器系统变量”](server-system-variables.html)， 和[第 5.1.10 节，“服务器状态变量”](server-status-variables.html).)

-   这[`线程缓存大小`](server-system-variables.html#sysvar_thread_cache_size)系统变量确定线程缓存大小。默认情况下，服务器会在启动时自动调整该值，但可以显式设置它以覆盖此默认值。值 0 禁用缓存，这会导致为每个新连接设置一个线程，并在连接终止时处理该线程。启用*`ñ`*要缓存的非活动连接线程，设置[`线程缓存大小`](server-system-variables.html#sysvar_thread_cache_size)到*`ñ`*在服务器启动或运行时。当与其关联的客户端连接终止时，连接线程将变为非活动状态。

-   要监视缓存中的线程数以及由于无法从缓存中取出线程而创建的线程数，请检查[`线程缓存`](server-status-variables.html#statvar_Threads_cached)和[`Threads_created`](server-status-variables.html#statvar_Threads_created)状态变量。

-   当线程堆栈太小时，这会限制服务器可以处理的 SQL 语句的复杂性、存储过程的递归深度以及其他消耗内存的操作。设置堆栈大小*`ñ`*每个线程的字节，启动服务器[`线程堆栈`](server-system-variables.html#sysvar_thread_stack)调成*`ñ`*.

##### 连接卷管理

要控制服务器允许同时连接的最大客户端数，请设置[`最大连接数`](server-system-variables.html#sysvar_max_connections)服务器启动或运行时的系统变量。可能需要增加[`最大连接数`](server-system-variables.html#sysvar_max_connections)如果更多客户端尝试同时连接，则服务器配置为处理（请参阅[第 B.3.2.5 节，“连接太多”](too-many-connections.html)）。如果服务器拒绝连接，因为[`最大连接数`](server-system-variables.html#sysvar_max_connections)达到限制，它增加[`Connection_errors_max_connections`](server-status-variables.html#statvar_Connection_errors_max_connections)状态变量。

[**mysqld**](mysqld.html)实际上允许[`最大连接数`](server-system-variables.html#sysvar_max_connections)+ 1 个客户端连接。额外的连接保留给拥有[`CONNECTION_ADMIN`](privileges-provided.html#priv_connection-admin)特权（或已弃用的[`极好的`](privileges-provided.html#priv_super)特权）。通过将权限授予管理员而不是普通用户（他们不应该需要它），管理员可以连接到服务器并使用[`显示进程列表`](show-processlist.html)即使连接了最大数量的非特权客户端，也可以诊断问题。看[第 13.7.7.29 节，“SHOW PROCESSLIST 语句”](show-processlist.html).

从 MySQL 8.0.14 开始，服务器还允许在管理网络接口上进行管理连接，您可以使用专用 IP 地址和端口进行设置。看[第 5.1.12.2 节，“管理连接管理”](administrative-connection-interface.html).

Group Replication 插件使用内部会话与 MySQL 服务器交互以执行 SQL API 操作。在 MySQL 8.0.18 的版本中，这些会话计入由[`最大连接数`](server-system-variables.html#sysvar_max_connections)服务器系统变量。在这些版本中，如果服务器已达到[`最大连接数`](server-system-variables.html#sysvar_max_connections)当 Group Replication 启动或尝试执行操作时，操作不成功并且 Group Replication 或服务器本身可能会停止。从 MySQL 8.0.19 开始，Group Replication 的内部会话与客户端连接分开处理，因此它们不计入[`最大连接数`](server-system-variables.html#sysvar_max_connections)如果服务器已达到此限制，则不会被拒绝。

MySQL 支持的最大客户端连接数（即最大[`最大连接数`](server-system-variables.html#sysvar_max_connections)可以设置）取决于几个因素：

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

-   可用的 RAM 量。

-   RAM 量用于每个连接。

-   每个连接的工作负载。

-   所需的响应时间。

-   可用文件描述符的数量。

    Linux 或 Solaris 通常能够支持至少 500 到 1000 个同时连接，如果您有许多 GB 的可用 RAM 并且每个连接的工作负载很低或响应时间目标要求不高，则应该能够支持多达 10,000 个连接。

    增加[`最大连接数`](server-system-variables.html#sysvar_max_connections)值增加文件描述符的数量[**mysqld**](mysqld.html)需要。如果所需数量的描述符不可用，则服务器会减少[`最大连接数`](server-system-variables.html#sysvar_max_connections).有关文件描述符限制的评论，请参阅[第 8.4.3.1 节，“MySQL 如何打开和关闭表”](table-cache.html).

    增加[`open_files_limit`](server-system-variables.html#sysvar_open_files_limit)系统变量可能是必需的，这可能还需要提高操作系统对 MySQL 可以使用多少文件描述符的限制。请查阅您的操作系统文档以确定是否可以增加限制以及如何增加限制。也可以看看[第 B.3.2.16 节，“找不到文件和类似错误”](not-enough-file-handles.html).
