一则 TCP 缓存超负荷导致的 MySQL 连接中断的案例分析

news2024/12/23 20:29:21

除了 MySQL 本身之外,如何分析定位其他因素的可能性?

作者:龚唐杰,爱可生 DBA 团队成员,主要负责 MySQL 技术支持,擅长 MySQL、PG、国产数据库。

爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。

本文约 1200 字,预计阅读需要 3 分钟。

背景

在执行跑批任务的过程中,应用程序遇到了一个问题:部分任务的数据库连接会突然丢失,导致任务无法完成。从数据库的错误日志中,发现了 Aborted connection 的信息,这说明客户端和服务器之间的通信被异常中断了。

分析

为了找出问题的原因,我们首先根据经验,分析了可能导致连接被 Aborted 的几种常见情况:

  1. 客户端没有正确地关闭连接,没有调用 mysql_close() 函数。
  2. 客户端空闲时间超过了 wait_timeoutinteractive_timeout 参数的秒数,服务器自动断开了连接。
  3. 客户端发送或接收的数据包大小超过了 max_allowed_packet 参数的值,导致连接中断。
  4. 客户端试图访问数据库,但没有权限,或者使用了错误的密码,或者连接包不包含正确的信息。

然而,经过排查,发现以上情况都不适用于当前的问题。因为任务在之前都是正常运行的,而且程序也没有变动,所以可以排除第一种情况。查看了 MySQL 的超时参数 wait_timeoutinteractive_timeout ,发现它们都是 28800,也就是 8 个小时,远远超过了任务执行时间,所以可以排除第二种情况。也检查了客户端和服务器的 max_allowed_packet 参数,发现它们都是 64M,也不太可能超过这个限制,所以可以排除第三种情况。我们也确认了客户端的数据库访问权限,密码,连接包等信息,都是正确的,所以可以排除第四种情况。

到此,我们初步感觉 MySQL 层面应该没有问题,问题可能出在其他地方。

为了进一步定位问题,我们尝试了修改服务器的一些相关内核参数,如下:

net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_time = 120
net.core.rmem_default = 2097152
net.core.wmem_default = 2097152
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_syn_backlog = 16384

这些参数主要是为了优化网络连接的性能和稳定性,避免连接被意外关闭或超时。但是,修改后的结果并没有改善,连接还是会异常中断。

最后,我们尝试了进行抓包分析,通过 Wireshark 工具,我们发现了一个异常的现象:服务器会给客户端发送大量的 ACK 包。如下图所示:

这些 ACK 包是 TCP 协议中的确认包,表示服务器已经收到了客户端的数据包,请求客户端继续发送数据。但是,为什么服务器会发送这么多的 ACK 包呢?我们猜测可能是网络有异常,导致客户端接收不到服务器返回的 ACK 包,所以服务器会反复发送 ACK 包,直到超时或收到客户端的响应。但是,经过网络人员的排查,未发现有明显的问题。

继续分析抓包,我们又发现了另一个异常的现象:客户端会给发送服务器一些窗口警告。如下图所示:

这些窗口警告是 TCP 协议中的流量控制机制,表示服务器或客户端的接收窗口已经满了,不能再接收更多的数据。

[TCP Window Full] 是发送端向接收端发送的一种窗口警告,表示已经到数据接收端的极限了

[TCP ZeroWindow] 是接收端向发送端发送的一种窗口警告,告诉发送者,接收端接收窗口已满,暂时停止发送。

根据以上信息,我们推测出了问题的原因:由于 MySQL 需要发送的数据太大,客户端的 TCP 缓存已经满了,所以需要等待客户端把 TCP 缓存里面的数据消化掉,才能继续接收数据。但是,在这段时间内,MySQL 会一直向客户端请求继续发送数据,如果客户端在一定时间内(默认是 60 秒)没有响应,MySQL 就会认为发送数据超时,中断了连接。

为了验证推测,查看 MySQL 的慢日志,发现了很多 Last_errno: 1161 的记录。

这些记录表示 MySQL 在发送数据时遇到了超时错误,而且发现出现的次数和应用程序失败的任务数很接近。根据 MySQL 官网的说明,这个错误的含义是:

Error number: 1161; Symbol: ER_NET_WRITE_INTERRUPTED; SQLSTATE: 08S01

Message: Got timeout writing communication packets

可知这个表示的意思是网络写入中断,而MySQL层面有个参数就是控制这个的,所以尝试更改net_write_timeout参数为600,跑批任务正常运行。

所以 MySQL 连接被异常中断的原因在于客户端获取的数据库太大,超过了客户端 TCP 缓存,客户端需要先处理缓存中的数据,在这段时间内,MySQL 会一直向客户端请求继续发送数据,但是客户端 60 秒内一直未能响应,导致 MySQL 发送数据超时,中断了连接。

结论

通过上述的分析和尝试,我们得出了以下的结论:

  • 抓包信息中,有很多 ACK 信息是因为客户端的缓存满了不能及时给服务端反馈,所以服务器会反复发送 ACK 信息,直到超过 60秒(net_write_timeout 默认值是 60),导致 MySQL 把连接中断了。
  • 慢日志中,有很多 Last_errno: 1161 的记录,是因为该 SQL 实际已经在 MySQL 中执行完毕了,但是在发送数据到客户端时,由于数据量太大超过了客户端的 TCP 缓存,然后客户端上的应用在 60 秒内未把缓存中的数据处理掉,导致 MySQL 往客户端发送数据超时。
  • MySQL 层面调整 net_write_timeout 参数只能缓解这个现象,根因在于单个 SQL 获取的数据量太大,超过了客户端的缓存大小,应用程序不能短时间内处理完缓存中的数据,进而导致后续的数据发送超时。

优化建议

  • 业务层面进行分批处理数据,避免单个 SQL 从服务器获取大量的数据,导致客户端的 TCP 缓存不足。
  • 提高 MySQL 中的 net_write_timeout 参数或者增加客户端的 TCP 缓存,可缓解此情况的发生,但不能彻底解决该问题,因为数据量太大仍然会影响性能和稳定性。
  • 优化 SQL 语句,减少不必要的数据返回,比如使用 LIMIT、WHERE 等条件,或者使用聚合函数,分组函数等,以减少数据量和提高查询效率。

更多技术文章,请访问:https://opensource.actionsky.com/

关于 SQLE

SQLE 是一款全方位的 SQL 质量管理平台,覆盖开发至生产环境的 SQL 审核和管理。支持主流的开源、商业、国产数据库,为开发和运维提供流程自动化能力,提升上线效率,提高数据质量。

SQLE 获取

类型地址
版本库https://github.com/actiontech/sqle
文档https://actiontech.github.io/sqle-docs/
发布信息https://github.com/actiontech/sqle/releases
数据审核插件开发文档https://actiontech.github.io/sqle-docs/docs/dev-manual/plugins/howtouse

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1620098.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

正整数的性质:和与根

目录 数字和 数字和介绍 数字和简单应用 哈沙德数 最小元素各数位之和 数字根 数字根介绍 数字根简单应用 数字和 数字和介绍 简单来说,数字和即一个整数数字每一位数值相加求和所得的值,数字和可以为任意正整数,使用代码获取一个数值的数字和…

干货|交流非线性RCD负载的重要指标

在电力系统中,非线性负载是一个重要的问题。它们会对电力系统的稳定性和电能质量产生重大影响。因此,对非线性负载的研究和管理具有重要的实际意义。在交流非线性RCD(Residual Current Device)负载中,有几个重要的指标…

挤浆机液压系统比例阀放大器

挤浆机液压系统比例阀放大器是一种在制浆工程中用于洗涤浆料的设备,它通过机械压榨的方式,从纸浆中提取出黑液(即造纸过程中产生的废液)。主液压系统其主要功能是驱动挤浆机的两个辊子转动。这两个辊子负责将浆料中的水分挤出&…

Unity的旋转实现一些方法总结(案例:通过输入,玩家进行旋转移动)

目录 1. Transform.Rotate 方法 使用 2. Transform.rotation 或 Transform.localRotation 属性与四元数 使用方式: 小案例 :目标旋转角度计算:targetRotation(Quaternion类型) 玩家发现敌人位置,玩家…

SWCTF

easy_php 源码 <?php// flag is in flag.php highlight_file(__FILE__); ini_set(display_errors, 0); error_reporting(0);if (isset($_GET[myon1]) && isset($_GET[myon2]) && isset($_GET[myon3])) {$myon1 $_GET[myon1];$myon2 $_GET[myon2];$myon…

揭秘内网渗透:命令大全助你轻松测试安全【内网渗透命令大全】

网络安全最新课程大纲 感兴趣可留言 1.域常用操作命令&#xff1a; net group /domain //获得所有域用户组列表 net group qq_group /domain //显示域中qq_group组的成员 net group qq_group /del /domain //删除域中qq_group组 net group qq_group qq /del /domain …

2024创业项目新方向,智享无人实景直播配合智能贴图数字人,让直播更简单,帮助商家快速引流客户到店,帮助创业者轻松实现梦想!

随着科技的迅猛发展&#xff0c;直播行业也经历了一次又一次的变革和创新。在2024年&#xff0c;AI实景无人直播成为了这个领域的全新宠儿&#xff0c;为商家和观众带来了前所未有的智能、高效体验。这种革命性的直播方式不仅降低了运营成本&#xff0c;还极大地提升了直播的效…

Aigtek功率放大器的工作特点有哪些方面

功率放大器是电子设备中常见的元器件&#xff0c;用于将输入信号的功率增加到所需的输出功率水平。它在各种应用中发挥着重要作用&#xff0c;如音频放大、射频信号处理、通信系统等。功率放大器具有以下几个工作特点&#xff1a; 放大功能&#xff1a;功率放大器主要的工作特点…

怎样快速插入数据

1、30万条数据插入插入数据库验证 1.1、表结构&#xff1a; CREATE TABLE t_user (id int(11) NOT NULL AUTO_INCREMENT COMMENT 用户id,username varchar(64) DEFAULT NULL COMMENT 用户名称,age int(4) DEFAULT NULL COMMENT 年龄,PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT…

Python自学篇2-导入Win32库

Python导入win32模块 导入win32模块可以让我们在Python中使用Windows的API功能&#xff0c;这对于开发需要与Windows操作系统进行交互的应用程序非常有用。 本文将介绍如何导入win32模块&#xff0c;并提供一些代码示例来帮助读者更好地理解。 什么是win32模块&#xff1f; …

【Stable Diffusion系列】(一):AI绘画本地部署教程

目录 一、总览 二、本地部署 1、安装cuda 2、安装python 3、安装git 4、方法一 1&#xff09;获取安装包 2&#xff09;update 3&#xff09;run 5、方法二 1&#xff09;git clone 2&#xff09;双击webui-user.bat 3&#xff09;更新 6、设置启动参数 7、…

LiveNVR监控流媒体Onvif/RTSP常见问题-如何对比监控摄像头延时视频流延时支持webrtc视频流播放超低延时播放

LiveNVR如何对比监控摄像头延时视频流延时支持webrtc视频流播放超低延时播放 1、问题场景2、如何对比延时&#xff1f;3、WEBRTC延时对比4、LiveNVR支持WEBRTC输出5、RTSP/HLS/FLV/RTMP拉流Onvif流媒体服务 1、问题场景 需要低延时的视频流监控播放&#xff0c;之前可以用rtmp…

pytorch-MNIST测试实战

目录 1. 为什么test2. 如何做test3. 什么时候做test4. 完整代码 1. 为什么test 如下图&#xff1a;上下两幅图中蓝色分别表示train的accuracy和loss&#xff0c;黄色表示test的accuracy和loss&#xff0c;如果单纯看train的accuracy和loss曲线就会认为模型已经train的很好了&a…

C++初识--------带你从不同的角度理解引用的巧妙之处

1.对于展开的理解 我们这里的展开包括命名空间的展开和头文件的展开&#xff0c;两者的含义是不一样的&#xff1a; 头文件的展开就是把头文件拷贝到当前的文件里面&#xff1b; 命名空间的展开不是拷贝&#xff0c;而是因为编译器本身默认是到全局里面去找&#xff0c;当我…

【热议】硕士和读博士洗碗区别的两大理论

::: block-1 “时问桫椤”是一个致力于为本科生到研究生教育阶段提供帮助的不太正式的公众号。我们旨在在大家感到困惑、痛苦或面临困难时伸出援手。通过总结广大研究生的经验&#xff0c;帮助大家尽早适应研究生生活&#xff0c;尽快了解科研的本质。祝一切顺利&#xff01;—…

SWOT分析法:知彼知己的战略规划工具

文章目录 一、什么是SWOT分析法二、SWOT分析法如何产生的三、SWOT分析法适合哪些人四、SWOT分析法的应用场景五、SWOT分析法的优缺点六、SWOT分析实例 一、什么是SWOT分析法 SWOT分析法是一种用于评估组织、项目、个人或任何其他事物的战略规划工具。SWOT是Strengths&#xff…

组态风格的工业可视化大屏,既同步状态又掌控数据,一箭双雕。

可视化大屏中加入了组态图&#xff0c;状态和数据一目了然了&#xff0c;我看还有谁说可视化大屏没啥用啦。 将组态图放入可视化大屏中可以起到以下几个作用&#xff1a; 1. 实时监控&#xff1a; 组态图可以用来实时监控设备、系统或者生产线的运行状态。通过大屏展示&#…

HackMyVM-Alzheimer

目录 信息收集 arp nmap FTP服务信息收集 匿名登陆 关键信息 knock WEB信息收集 信息收集 gobuster 目录爆破 ssh登录 提权 系统信息收集 提权 get root 信息收集 arp ┌──(root㉿0x00)-[~/HackMyVM] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC…

应用于智能装备制造,钡铼IOy系列模块展现其强大的灵活性和实用性

随着科技的飞速发展&#xff0c;智能制造已经成为工业4.0时代的核心驱动力。在此背景下&#xff0c;钡铼技术推出的IOy系列模块以其独特的设计、卓越的性能以及无可比拟的灵活性与实用性&#xff0c;在智能装备制造领域展现出了强大的技术优势和应用价值。 首先&#xff0c;钡…

Excel 冻结前几行

Excel中有冻结首航和冻结首列的选项&#xff0c;但是如果想冻结前几行该怎么操作&#xff1f; 冻结首行或冻结首列 视图 -> 冻结窗格 -> 冻结首行或冻结首列 冻结前几行或前几列 视图 -> 冻结窗格 -> 冻结拆分窗格 具体冻结几行和几列取决于当前选中的单元格。…