【ERROR】MySQL太多连接数,导致阻塞
1、引言:
在当今数字化时代,数据扮演着至关重要的角色。作为企业的数据存储和管理引擎之一,MySQL在众多Web应用和服务中占有重要地位。然而,有时候,即使是最强大的工具也会出现问题。其中一个常见而令人头疼的问题就是"too many connections"错误。
这个错误意味着MySQL服务器无法处理当前正在尝试连接的客户端请求,因为已经达到了最大允许的连接数。在这篇博客文章中,我们将深入探讨这个问题的原因,以及如何解决它,使您的MySQL数据库保持健康运行。
2、理解"too many connections"错误
MySQL默认的最大连接数为100,MySQL服务器允许的最大连接数16384
首先,让我们来了解一下这个错误背后的原因。当MySQL服务器无法为新的客户端连接提供服务时,会触发"too many connections"错误。这可能发生因为以下几个原因:
- 达到最大连接数限制:MySQL服务器有一个最大连接数的限制,通常在配置文件中设置(通常是my.cnf或my.ini)。一旦达到这个限制,新的连接请求就会被拒绝。
- 长时间不关闭的连接:如果客户端应用程序在使用完连接后不及时关闭连接,会导致连接数堆积。
- 连接泄漏:有时应用程序中的bug或者编程错误可能导致连接没有被正确关闭,从而造成连接泄漏。
3、排查步骤
1、查询连接类容,定位大致机器
#登录mysql
mysql -uroot -p
# 执行命令
SHOW PROCESSLIST;
| 5148 | root | kubernetes-node.0101211100.fjf:36334 | fubaoxx | Sleep | 561 | | NULL |
| 5201 | root | kubernetes-node.0101211100.fjf:36936 | fubaoxx | Sleep | 541 | | NULL |
每个字段的含义如下:
Id:连接的唯一标识符。
User:连接的用户名。
Host:连接的主机地址和端口号。
db:当前连接的数据库。
Command:当前连接正在执行的命令。
Time:连接的持续时间(以秒为单位)。
State:连接的状态。
Info:当前连接正在执行的查询或操作的详细信息。
根据这个时间,就可以推定是连接超时的参数为默认值,导致无法快速释放。
2、查询最大连接数
mysql> show variables like 'max_connections';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | 5000 |
+-----------------+-------+
1 row in set (0.00 sec)
这台MySQL服务器最大连接数是5000 ,然后查询一下服务器响应的最大连接数:
mysql> show global status like 'Max_used_connections';
+----------------------+-------+
| Variable_name | Value |
+----------------------+-------+
| Max_used_connections | 918 |
+----------------------+-------+
1 row in set (0.02 sec)
MySQL服务器最大连接数是5000,没有达到服务器连接数上限5000,应该不会出现oo many connections(1040)错误,比较理想的设置是:
Max_used_connections / max_connections * 100% ≈ 85%
最大连接数占上限连接数的85%左右,如果发现比例在10%以下,MySQL服务器连接上限就设置得过高了。
3、修改连接数
1、方法一:修改配置文件。(推荐方法一)
vim /etc/my.conf
max_connections=5000
进入制MySQL安装目录 打开MySQL配置文件 my.ini 或 my.cnf查找 max_connections=100 修改为 max_connections=5000服务里重起MySQL即可。
方法二:命令行修改。(不推荐方法二)
命令行登录MySQL后。
设置新的MySQL最大连接数为200:
MySQL> set global max_connections=500
这种方式有个问题,就是设置的最大连接数只在mysql当前服务进程有效,一旦mysql重启,又会恢复到初始状态。因为mysql启动后的初始化工作是从其配置文件中读取数据的,而这种方式没有对其配置文件做更改。
4、wait_timeout和interactive_timeout 配置
MySQL超时时间是指MySQL与客户端之间的连接时间,超出该时间则会断开连接。默认情况下,MySQL的超时时间是8小时。
wait_timeout参数是指在没有活动连接的情况下,MySQL服务器关闭连接之前等待的秒数。默认时间为8小时,即28800秒。如果你的应用程序有长时间的空闲时间,可以适当地减少该值。
interactive_timeout参数与wait_timeout类似,不同的是它只适用于交互式连接,例如使用命令行或者phpMyAdmin连接MySQL。默认时间也是8小时,即28800秒。同样地,如果你的应用程序有长时间的空闲时间,可以适当地减少该值。
show GLOBAL VARIABLES like '%timeout%';
通过设置以下两个参数进行配置:
wait_timeout = 600
interactive_timeout = 600
那么,该如何确定适合你的应用程序的超时时间呢?这需要针对不同的应用程序进行具体分析。如果你的应用程序有很快的响应时间和高流量,可以将超时时间设置为较低的值,比如5分钟。如果你的应用程序有较慢的响应时间和低流量,可以将超时时间设置为较高的值,比如30分钟。
4、总结
- 控制连接最大空闲时长的wait_timeout参数。
- 对于非交互式连接,类似于jdbc连接,wait_timeout的值继承自服务器端全局变量wait_timeout。
- 对于交互式连接,类似于mysql客户单连接,wait_timeout的值继承自服务器端全局变量interactive_timeout。
- 判断一个连接的空闲时间,可通过show processlist输出中Sleep状态的时间。
- 超时时间只对非活动状态的connection进行计算。 超时时间只以session级别的wait_timeout
为超时依据,global级别只决定session初始化时的超时默认值。
注意事项
在使用MySQL时,还有一些需要注意的问题:
避免创建过多的连接,这会影响数据库性能。
使用连接池管理连接。
定期检查程序代码中是否正确关闭了数据库连接。
"too many connections"错误可能会对您的MySQL数据库产生严重的影响,但通过理解其原因并采取适当的措施,您可以减轻这个问题的影响,确保您的数据库系统保持稳定和高效运行。
i520c_and: 添加的初始化容器 init-sysctl 用于在 Ingress Nginx 控制器 Pod 启动之前执行一些系统级参数的优化。这些参数通过 sysctl 命令进行设置,主要用于调整 Linux 内核的网络和文件系统行为,以提高性能和资源利用率。以下是每个参数的详细解释: mount -o remount rw /proc/sys 这个命令重新挂载 proc 文件系统下的 sys 目录为读写模式。因为默认情况下,/proc/sys 是只读的,这个步骤是必要的,以便后续可以修改内核参数。 sysctl -w net.core.somaxconn=65535 net.core.somaxconn 参数定义了 TCP 套接字监听队列的最大长度。增加这个值可以允许更多的连接请求在被服务处理之前排队等待。默认值通常较低,增加它可以提高处理大量并发连接的能力。 sysctl -w net.ipv4.ip_local_port_range="1024 65535" net.ipv4.ip_local_port_range 参数定义了用于向外连接的本地端口范围。默认情况下,这个范围是从 32768 到 60999。将其设置为从 1024 到 65535 可以提供更多的端口供服务使用,这在高负载环境下特别有用。 sysctl -w net.ipv4.tcp_tw_reuse=1 net.ipv4.tcp_tw_reuse 参数允许重用处于 TIME_WAIT 状态的套接字。TIME_WAIT 状态是 TCP 连接关闭过程中的一个阶段,通常持续 60 秒。允许重用这些套接字可以更快地重新使用这些资源,特别是在短连接的应用中。 sysctl -w fs.file-max=1048576 fs.file-max 参数设置了系统可以打开的最大文件数量。增加这个值可以允许系统同时打开更多的文件,这对于高并发的服务来说是一个重要的优化。 sysctl -w fs.inotify.max_user_instances=16384 fs.inotify.max_user_instances 参数设置了每个用户可以创建的 inotify 实例的最大数量。inotify 是 Linux 提供的一种文件系统事件监控机制。增加这个值可以允许更多的并发监控。 sysctl -w fs.inoti
宝子们: 有没有方法可以自己设置需要导出的群组的,而不是所有的服务器
Mlxg2234: 我破解之后confluence咋就起不来了
实习的骑象人: jms3开始内置Prometheus了?
南宫乘风: 在Grafan的设置 配置 Prometheus的地址,就可以修改源。