Mysql aborted_client_MySQL之aborted connections和aborted clients

最近线上遇到一个问题,接口日志发现有很多超时报错,根据日志定位到数据库实例之后发现一切正常,一般来说接口出现超时排查顺序如下:

慢查询 -》连接数 -》 服务器负载 -》网卡流量,但是这次从QPS、连接数、服务器负载、IO消耗、响应时间及慢查询上都非常正常并没有什么异常发生,只有如下这个图有变化。

42ad81cb6fda77a3fc678558deee9dcc.png

在排除了前端服务器没有出现异常后,看来问题就出现在这个链接数变化上面了。为了看懂上面的图我们先说一下状态值的含义。

1、Max Connections和Max Used Connection

这两个就不细说了,分别是最大链接数限制和每个用户最大链接数限制。

2、Aborted Clients:

The number of connections that were aborted because the client died without closing the connection properly.

当ablort clients增大的时候意味着有客户端成功建立连接,但是很快就断开连接或者被终止了,这种情况一般发生在网络不稳定的环境中。主要的可能性有

a)客户端没有主动关闭mysql连接mysql_close()。

b)wait_timeout设置很短被mysql干掉了。

c)客户端由于某些原因被干掉了。

3、Aborted Connection:

The number of failed attempts to connect to the MySQL server.

当有大量的链接连接不上mysql的时候,这个数值就会激增。主要的可能有:

a)没有授权或者密码不对。一般错误日志中会有如下报错( Access denied for ‘user’@‘host’ )

b)连接数满了。一般报错包含(too many connections)

c)超过链接时间限制,主要有这个参数控制connect_timeout(mysql默认是10s,基本除非网络环境极端不好,一般不会超时。)

4、Threads Connected:

The number of currently open connections.

也就是我们经常使用show processlist看见那个数值。

5、Connections

The number of connection attempts (successful or not) to the MySQL server.

所有尝试连接到mysql server的连接数,关键时不管成功还是失败。所以这个数值的增量并不等于show processlist的数值,这点需要注意。

了解以上参数之后,就可以分析这个图了,首先第一反应时连接数有增加,我们可以看到connections和thread connected都增加了,但是没有达到max connections的限制。

在仔细看图下的数据,我们发现abort connection和connections的max值和avg值基本一样,在仔细看图,可以发现蓝线和绿线基本重合了。

从上述参数含义看,在问题时间段所有尝试建立的链接都失败了,导致connections和abort connection同步增加完全重叠。

但是究竟是什么导致链接数上升,前端开始重建链接,由于当时的前端日志没有及时分析出来,故我们就不得而知了。但是有3个怀疑点:

1、由于mysql版本是5.5.12,所以可能遇到了max_connections的bug,可以见这个blog(http://www.cnblogs.com/billyxp/p/3408335.html),这种情况下,前端日志应该有非常多的too many connection是的报错。

2、短时间内有大量的大包传输,导致超过max_allow_packet的限制,导致断开连接。这个设置在server和client上都有,需要同步配置。同时前端应该报 Got a packet bigger than ‘max_ allowed__packet ’ bytes这个报错。

3、超过max_connect_error的限制,导致某一个ip出现问题,不停的重试。(这个可能是最不可能,首先默认数值非常大,其次单个ip不应该出现这么大的影响。max_connect_error代表某一个ip连续失败超过n之后,server会拒绝这个ip的请求,只有flush host cache才可以解封。)

<think>好的,我现在需要处理用户提出的关于MySQL中wait_timeout过多的问题。首先,我得理解用户的问题到底是什么。用户提到“wait_timeout过多”,可能是指MySQL中存在大量因为超时而被关闭的连接,或者连接数过多导致资源占用,进而影响性能。接下来,我需要回忆一下MySQL中wait_timeoutinteractive_timeout的作用,以及它们之间的关系。 根据引用内容,wait_timeout是控制非交互式连接的空闲超时时间,而interactive_timeout用于交互式连接。如果这两个参数设置不当,可能会导致连接过早被关闭,或者长时间占用资源。用户的问题可能涉及如何调整这些参数,或者优化连接管理来减少超时发生的情况。 接下来,我需要考虑如何处理这个问题。首先,可能需要检查当前的wait_timeoutinteractive_timeout的值,看看是否设置合理。通常,默认值可能比较低,比如8小时,但实际应用中可能需要根据具体情况调整。如果应用有长时间空闲的连接,可能需要适当增加这个值,但也不能太高,避免占用过多资源。 然后,用户可能需要优化应用程序的连接管理,比如使用连接池,避免频繁创建关闭连接,这样可以减少新建连接的次数,从而减少超时的可能。此外,检查是否有连接泄漏的情况,即应用程序获取连接后没有正确释放,导致连接一直存在直到超时。 另外,引用中提到,如果想让所有客户端的超时时间一致,需要同时设置global的wait_timeoutinteractive_timeout。这可能是因为不同的客户端类型(交互式非交互式)会使用不同的超时设置,所以统一设置这两个参数可以确保所有连接使用相同的超时时间。 还需要考虑MySQL的版本,不同版本可能有不同的默认行为。比如在引用[2]中提到,设置global参数时需要注意可能需要同时设置这两个参数。此外,查看当前会话的超时设置,因为有些设置可能在会话级别被覆盖。 用户的问题可能还涉及到如何监控当前的连接状态,查看有多少连接是因为超时被关闭的,这可以通过MySQL的状态变量或者日志来检查。例如,查看Aborted_connects或者Aborted_clients的指标,分析超时的原因。 此外,优化服务器资源,比如增加最大连接数(max_connections)或者调整线程缓存(thread_cache_size),可能也有助于减少连接创建的开销,但需要平衡资源使用。 最后,可能需要考虑使用持久连接或调整应用逻辑,减少不必要的连接保持时间。例如,在完成操作后及时释放连接,避免长时间空闲。 总结下来,处理步骤可能包括: 1. 检查并调整wait_timeoutinteractive_timeout参数。 2. 使用连接池管理连接。 3. 检查修复连接泄漏。 4. 监控分析连接超时的情况。 5. 优化服务器资源配置。 6. 统一设置global参数以确保一致性。 7. 调整应用逻辑,及时释放连接。 接下来需要将这些步骤结构化,用清晰的中文回答,并生成相关问题。同时确保遵循用户提供的格式要求,比如行内公式使用$...$,独立公式用$$...$$,引用标识正确添加。</think>### 如何处理优化 MySQL 中 wait_timeout 过多的情况? #### 1. **调整超时参数** - **设置合理的超时值**: 根据应用需求,适当调整 `wait_timeout` `interactive_timeout`。例如,若应用存在长空闲连接,可适当增大参数值,但需避免过高导致资源浪费。 全局设置命令: ```sql SET GLOBAL wait_timeout = 280000; SET GLOBAL interactive_timeout = 280000; ``` 或在配置文件(如 `my.cnf`)中添加: ```ini wait_timeout = 280000 interactive_timeout = 280000 ``` 注意:修改后需重启 MySQL 或执行 `SET GLOBAL` 生效[^1][^2]。 - **确保参数一致性**: 若需所有客户端统一超时规则,需同时设置 `wait_timeout` `interactive_timeout`,避免因客户端类型不同导致超时行为差异[^2]。 #### 2. **优化连接管理** - **使用连接池**: 通过连接池复用连接,减少新建连接的频率。例如,Java 应用可使用 HikariCP 或 Druid 等连接池工具,配置合理的 `maxLifetime` `idleTimeout`。 - **避免连接泄漏**: 检查代码确保所有数据库操作后正确关闭连接。可通过监控 `SHOW PROCESSLIST` 或 `information_schema.PROCESSLIST` 发现长期空闲连接。 #### 3. **监控与分析** - **查看当前超时配置**: ```sql SHOW GLOBAL VARIABLES LIKE 'wait_timeout'; SHOW GLOBAL VARIABLES LIKE 'interactive_timeout'; ``` - **分析连接状态**: 通过以下命令监控活跃连接超时情况: ```sql SHOW STATUS LIKE 'Aborted_connects'; -- 因超时等原因中断的连接数 SHOW STATUS LIKE 'Threads_connected'; -- 当前活跃连接数 ``` #### 4. **优化服务器资源** - **调整 `max_connections`**: 根据服务器资源(如内存)合理设置最大连接数,避免过多连接导致资源耗尽。 ```sql SET GLOBAL max_connections = 500; -- 示例值 ``` - **启用线程缓存**: 通过 `thread_cache_size` 缓存空闲线程,减少频繁创建线程的开销。 ```sql SET GLOBAL thread_cache_size = 32; -- 建议值为 CPU 核心数 * 2 ``` #### 5. **应用逻辑优化** - **减少长事务**: 长事务会占用连接资源,尽量拆分事务或优化查询效率。 - **按需保持连接**: 若非必要,避免使用持久连接(如 PHP 中 `pconnect`),优先使用短连接。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值