开发中的网络问题逻辑推理分析

ops/2024/9/20 7:03:19/ 标签: 网络, 抓包分析, 逻辑推理, 解决问题

基于TCP/IP的逻辑推理,大部分软件从业人员都不是很懂,导致很多问题都被误认为诡异问题。有些人是惧怕TCP/IP网络书籍中的复杂知识内容,有的是被wireshark[1]显示的深红色内容所干扰。

经典案例1:

例如有一个DBA遇到了性能问题,进行了抓包分析,但被wireshark中的内容所干扰,以为是TCP重传问题。

Figure 1. Packet capture screenshot provided by DBA suspecting retransmission problems.

既然怀疑是重传,应该去了解重传的本质是什么。重传的本质是超时重传,如果要确定是否是重传所导致,那么显然是要给出时间相关信息的,但上面截图并没有给出。

让开发人员重新截图后,看到了时间信息,具体见下图:

Figure 2. Packet capture screenshot with time information added.

网络分析时,可以利用时间信息进行逻辑推理。如果重复的两个数据包时间差是微秒级别,那么要么是超时重传,要么是重复抓包。假设TCP超时在微秒级别,TCP设计时至少要满足一个Round-trip timeRTT)才能重传,而上面截图是常规LAN环境下的抓包,RTT一般为100微秒级别,重传时间差和RTT相差了100倍,所以上图中的重传并不是超时重传,而是重复抓包。

经典案例2:

再以一个经典案例来讲述逻辑推理网络问题分析中的重要性:

有一天,业务开发和DBA运维跑过来,说凌晨调用MyQL数据库中间件[1]的定时脚本出问题了,MySQL数据库中间件没有响应回来。当听到这个问题以后,我查看了MySQL数据库中间件的错误日志,结果没有发现任何有价值的线索。于是我问开发能不能把问题重现一下,因为只要能够重现,问题就容易解决。开发回去试验了多次,问题没有重现,不过开发有了新的发现:执行相同的SQL语句,白天SQL的响应时间跟凌晨的响应时间不一样。开发认为SQL响应很慢的时候,MySQL数据库中间件会阻塞住会话,不返回结果给客户端。于是请DBA运维修改脚本中的SQL去模拟SQL响应慢的场景,结果MySQL数据库中间件返回了结果,没有出现凌晨的死等现象。

一时找不到根本原因,而开发发现了MySQL数据库中间件有功能方面的问题。因此,开发和DBA运维更加坚信是MySQL数据库中间件迟迟没有返回响应。事实上,这些问题与MySQL数据库中间件响应并不相关。

从第一天的情况来看,问题确实出现了,每一个相关的人都想找到问题原因,会做各种猜测,但并没有找到真正的原因。

第二天,开发反馈半夜的脚本问题又出现了,但白天还是无法重现。DBA运维反馈说白天试验偶尔会出现,第一次执行会出现,但不幸的是这个结论被后续测试所否定,问题再也没有在白天重现过。开发着急的抱怨线上很快就要使用脚本,我只能建议开发白天使用脚本,避免凌晨出现的问题。因为所有怀疑都聚焦在MySQL数据库中间件上面,很难从其他角度去分析问题。

作为MySQL数据库中间件的开发人员,这么诡异的问题不能轻易放过,否则会影响MySQL数据库中间件的后续使用,而且领导也要求问题必须尽快解决。最终决定用低成本抓包分析的方案,即在凌晨脚本执行的时候,在服务器端进行抓包,分析当时发生了什么:要么MySQL数据库中间件一直没有发送响应,要么MySQL数据库中间件返回了响应,客户端脚本没有收到。只要确认MySQL数据库中间件发送了响应,就不是MySQL数据库中间件开发人员的问题。

第三天,开发反馈凌晨问题没有再次出现,抓包分析也确认问题没出现。经过深入思考,如果是MySQL数据库中间件的问题,应该不会如此这么诡异:在凌晨多次出现,在白天却很难出现。只能继续等问题再出现,根据抓包进行分析。

第四天,问题还是没有出现。

第五天,问题终于出现,有希望了。

抓包文件很多,首先让开发给出问题出现的时间点,在大量的抓包信息里面找出出现问题的SQL语句,最终找到的结果如下:

Figure 3. Key packet information captured for problem resolution.

从上面的抓包文件(从服务器抓取)来看,发送SQL时间为凌晨3点,MySQL数据库中间件服务过了630秒(03:10:30.899249-03:00:00.353157)返回SQL响应信息给客户端,这说明MySQL数据库中间件是返回SQL响应的,但过了仅仅238微秒(03:10:30.899487-03:10:30.899249),服务器的TCP层就接收到了reset数据包,这么快就返回,reset数据包非常可疑。需要注意的是,这reset数据包,不能直接认为是客户端发的。首先要确认reset数据包是谁发的,要么是客户端发的,要么是中途设备发的。

因为抓包只在服务器端进行,客户端数据包情况并不了解。尝试通过分析服务器端的抓包文件,进行逻辑推理找出问题根源。假设客户端发送了reset,那意味着客户端TCP层已经不存在这个连接的TCP状态了,TCP状态从有到无,会通知客户端应用连接异常,客户端脚本在收到这个通知后,会立即报错,但现实是客户端仍然在等待响应回来,因此假设不成立,客户端没有发送reset。客户端连接还活着,但服务器这边的相应连接已经被reset干掉了。

reset到底是谁发的呢?最大怀疑对象是亚马逊的云环境。DBA运维根据这个抓包分析结果询问亚马逊客服,得到如下信息:

Figure 4. Final response from Amazon customer service.

客服给出的答复与分析结果一致,是亚马逊的elb(类似LVS负载均衡器)强制干扰了TCP会话。图中的回复指出,如果响应超过了350秒阈值(抓包显示为630秒),亚马逊的elb设备就会发送reset给响应的一方(本案例里是发送给服务器)。开发部署的客户端脚本,被忽视了,并没有接收到reset,认为服务器连接仍然还活着。官方对此类问题的建议是,利用TCP keepalive机制来规避这方面的问题。

得到官方答复以后,问题算是彻底解决。

从这个具体案例来看,线上问题有时候是非常复杂的,需要有关键信息的获取,这里是抓包信息,捕获到当时发生的情况。利用逻辑推理,分析出根源,这里采用了归谬法来辅助判断。

参考资料

[1] https://www.wireshark.org/

[2] MySQL proxy based: https://github.com/session-replay-tools/cetus.

[3] Bin Wang (2024). The Art of Problem-Solving in Software Engineering:How to Make MySQL Better.


http://www.ppmy.cn/ops/109651.html

相关文章

vs2019成功连接数据库mysql

②在vs2019中创建新项目,注意x64 ③ 右击项目打开属性 ④添加include路径 ⑤添加lib路径 点击确定后点击应用 ⑥ 点击全部确定 ⑦ ⑧启动mysql 进入数据库: 在数据库中创建student的表 ⑨在va2019中输入下面代码测试 注意:密码换成自己…

零基础转行自学大模型路线规划(附快速学习路线图)

每一波浪潮的到来,都意味一片无人占领的蓝海,也意味着众多新成长起来的巨头,还意味着什么?大量的技术人员需求,供不应求的开发市场,以及从业者的高薪与众多的机会。 我们最常做的事情是目送着上一次浪潮的…

c++修炼之路之AVL树与红黑树

目录 一:AVL树 1.AVL树的概念 2.AVL树插入数据后平衡因子及更新的情况 3.AVL树节点的定义 4.AVL树的插入及旋转 二:红黑树 1.红黑树的概念及性质 2.红黑树节点的定义 3.红黑树的插入操作情况 4.红黑树与AVL树的比较 接下来的日子会顺顺利利…

【AbMole】凯氏定氮法测定氨基酸含量

凯氏定氮法的原理是基于氨的定量反应,其中有机物样品中的氮通过消化和蒸馏步骤转化为氨气,并通过滴定进行量化测定。 由于氮在许多生物和环境样品中广泛存在,凯氏定氮法成为测定样品中氮含量的常用方法。往样品中加入浓硫酸和催化剂&#xf…

HarmonyOS】ArkTS学习之基于TextTimer的简易计时器的elapsedTime最小时间单位问题

本文旨在纪录自己对TextTimer使用过程的疑惑问题 我在查看教程时候,发现很多博客在onTimer(event: (utc: number, elapsedTime: number) > void) 这里提到elapsedTime:计时器经过的时间,单位为毫秒。我不清楚是否为版本问题。 在我查看ver…

Java项目: 基于SpringBoot+mybatis+maven大学生就业招聘系统(含源码+数据库+毕业论文)

一、项目简介 本项目是一套基于SpringBootmybatismaven大学生就业招聘系统 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,eclipse或者idea 确保可以运行! 该系统功能完善、界面美观、操作…

快人一步迅为LPDDR5版本瑞芯微RK3588核心板升级了

性能强--iTOP-3588开发板采用瑞芯微RK3588处理器,是全新一代ALoT高端应用芯片,采用8nm LP制程,搭载八核64位CPU,四核Cortex-A76和四核Cortex-A55架构,主频高达2.4GHZ,8GB内存,32GB EMMC。四核心…

spring容器创建bean过程中使用到的几个factory

文章目录 前述BeanFactoryFactoryBeanObjectFactory 前述 spring我们可以理解为一个帮我们管理bean的容器,使用spring框架之前创建bean都是通过new的方式,使用spring框架之后, 我们只需要告诉spring框架我们有那些bean,它会帮我们…

比较差异 图片 视频

目录 两张图片像素差: 深度图和rgb图对齐 视频比较差异: 结构化(1行)贴到深度图上(5行): 两张图片像素差: diffnp.clip(np.abs( img_mask.astype(np.int16))-img.astype(np.int16), 0, 255).astype(np.uint8) 深度图和rgb图对…

场景感知技术带您重塑未来生活的新篇章

在科技日新月异的今天,场景感知技术正以前所未有的速度渗透到我们生活的方方面面,成为连接物理世界与数字世界的桥梁,重塑着人类的认知方式与生活体验。这项技术通过综合运用传感器、大数据分析、人工智能等前沿科技,实现对周围环…

【数据库】个人对数据库的认知和可能的演变过程

个人想法: 我说一下我对数据库的认知 刚开始的时候,我认为数据库应该是一个类似于excel的表格 后来学了编程之后呢,我觉得呀他可能是一个数组,如果内容比较多的话,他可能是一个二维数组,后来我听说数据库里…

Linux seq命令

参考资料 知っておくとちょっと便利!seq コマンドの使い方をご紹介 目录 一. 基本语法二. 选项2.1 -f 格式化输出2.2 -s 指定分隔符2.3 -w 输出数字补齐宽度 三. 小案例3.1 递减序列3.2 批量创建测试文件3.3 批量下载文件 一. 基本语法 seq [OPTION] 结束值 seq […

小样本学习+多模态

小样本学习多模态 小样本学习和多模态学习的结合是一种前沿的研究方向,主要作用是在利用少量的训练数据来学习多个模态(如文本、图像、音频、视频等)之间的关系或进行跨模态的任务。通过这种结合,模型能够在极少的样本情况下&…

C++学习,多继承

多继承,一个子类可以有多个父类,它继承了多个父类的特性。这种机制提供了强大的灵活性,但也带来了复杂性,特别是当涉及到基类中的同名成员(包括成员函数和变量)时。 C 类从多个类继承成员,语法如…

Java语言程序设计基础篇_编程练习题*18.21 (将十进制数转换为二进制数)

*18.21 (将十进制数转换为二进制数) 编写一个递归方法,将一个十进制数转换为一个二进制数的字符串。方法头如下: public static String dec2Bin(int value)编写一个测试程序,提示用户输入一个十进制数,然后显示等价的二进制数。 代码示例 …

STM32G070 CubeMX配置多通道/单通道ADC+DMA流程 LL库

基础配置不再赘述,时钟这些根据硬件来配置 多通道ADCDMA配置图: 程序配置: 调试查看内存数据,硬件上将PA1接到GND,PA2接到3V3 采集的数据会循环覆盖内存 问题:代码里先初始化ADC_IN1,再初…

电脑物理地址怎么修改方法

电脑物理地址怎么修改方法非常容易,需要用到一个小工具 首先需要下载一个修改软件《物理网卡mac修改器》,工具下载地址:https://download.csdn.net/download/baiseled/89633292 1.点击软件下拉框选中网卡序号 2.当前网卡mac物理地址就会显示…

《机器学习》数据预处理 删除、替换、填充 案例解析及实现

目录 一、了解数据清洗 1、什么是数据清洗 2、数据清洗步骤 1)缺失值处理 2)异常值处理 3)重复值处理 4)格式修正 5)数据一致性检查 6)数据类型转换 二、数据清洗用法 1、有如下文件内容 2、完…

使用令牌(Token)进一步优化 SwiftData 2.0 中历史记录追踪(History Trace)的使用

概览 在今年的 WWDC 24 中,苹果将 SwiftData 升级为了 2.0 版本。其中对部分已有功能进行了增强的同时也加入了许多全新的特性,比如历史记录追踪(History Trace)、“墓碑”(Tombstone)等。 我们可以利用 H…

低代码开发平台:高效开发的新引擎

在数字化时代,软件开发的需求日益增长,传统的开发方式因其复杂性和耗时性已难以满足市场的快速变化。低代码开发平台作为一种创新的解决方案,正逐渐成为软件开发领域的新宠。勤研低代码平台通过图形化界面和预制模块,使得应用开发…