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

news/2024/9/19 18:55:47/ 标签: 网络, 抓包分析, 逻辑推理, 解决问题

基于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/news/1523965.html

相关文章

【数据结构】2——二叉树遍历

数据结构2——二叉树遍历 单纯记录 文章目录 数据结构2——二叉树遍历一、二叉树遍历1,先序遍历:根左右递归实现非递归实现(栈) 2.中序遍历:左根右递归非递归 3 .后序遍历:左右根递归非递归(两…

GDB 查看汇编

查看汇编 x disassemble

Linux 中 Tail 命令的 9 个实用示例

引言 我们作为 Linux 用户,经常会操作那些在后台长时间运行的进程,这些进程被称作守护进程或服务。例如 Secure Shell (sshd)、Network Manager (networkd)、Volume Manager (LVM)、Cron 等都是服务的典型例子,这样的服务还有很多。 在许多情…

Windows安装HeidiSQL教程(图文)

一、软件简介 HeidiSQL是一款开源的数据库管理工具,主要用于管理MySQL、MariaDB、SQL Server、PostgreSQL和SQLite等数据库系统。它提供了直观的用户界面,使用户可以轻松地连接到数据库服务器、执行SQL查询、浏览和编辑数据、管理数据库结构等操作。 跨…

Java 内部类包含静态内部类(Static Nested Class)、非静态内部类(Inner Class)

在 Java 中,内部类主要分为以下几种类型: 成员内部类(Member Inner Class)静态内部类(Static Nested Class)局部内部类(Local Inner Class)匿名内部类(Anonymous Inner …

芋道系统excel导出,springcloud+vue3

前端代码&#xff1a; <el-form-item><el-buttontype"success"plainclick"handleExport":loading"exportLoading"v-hasPermi"[teach:course-manage:export]"><Icon icon"ep:download" class"mr-5px&quo…

【mysql】mysql之主从延迟复制测试场景

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…

当水泵遇上物联网:智能水务新时代的浪漫交响

在当代科技的宏伟乐章中&#xff0c;物联网&#xff08;IoT&#xff09;技术宛如一位技艺高超的指挥家&#xff0c;引领着各行各业迈向智能化的新纪元。当这股创新浪潮涌向古老的水务行业时&#xff0c;一场前所未有的“智能水务”革命便悄然上演&#xff0c;而水泵——这一传统…

小宝宝的好伙伴Baby Buddy

好友 Eduna 前天半夜告诉我&#xff0c;Docker 的下载已经恢复&#xff0c;又可以愉快的玩耍了&#xff0c;大家赶紧去试试吧~ 什么是 Baby Buddy &#xff1f; Baby Buddy 是宝宝的好伙伴&#xff01;能帮助宝爸、宝妈、及护理人员跟踪宝宝的睡眠、喂食、换尿布、趴着的时间等…

【Linux】循序进阶学运维-服务篇-tomcat入门

[rootgaosh-1 jdk]# ##### []( )2\. 配置java环境\[rootgaosh-1 jdk\]# vim /etc/profile![在这里插入图片描述](https://img-blog.csdnimg.cn/20200801062552258.png)export JAVA_HOME/root/jdk/jdk1.8.0_131 ## 路径一定要对 export PATH J A V A H O M E / b i n : JAVA_HO…

Collections

Collections 是 Java 中的一个实用工具类&#xff0c;提供了一系列静态方法来操作集合。以下是其详细介绍&#xff1a; 前置知识 在 Java 中&#xff0c;可变参数&#xff08;Varargs&#xff09;允许方法接受可变数量的参数。使用可变参数时&#xff0c;可以传递任意数量的参…

EmguCV学习笔记 C# 11.3 DNN其它

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问…

Python Web 框架篇:Flask、Django、FastAPI介绍及其核心技术

Python Web 框架篇&#xff1a;Flask、Django、FastAPI介绍及其核心技术 目录 &#x1f40d; Flask Flask 核心概念&#xff08;路由、视图函数、模板渲染&#xff09;Flask Blueprint 模块化应用Flask 扩展&#xff08;Flask-SQLAlchemy、Flask-WTF、Flask-Migrate 等&#…

Centos7.9部署Gitlab-ce-16.9

一、环境信息 软件/系统名称版本下载地址备注Centos77.9.2009https://mirrors.nju.edu.cn/centos/7.9.2009/isos/x86_64/CentOS-7-x86_64-DVD-2009.isogitlab-cegitlab-ce-16.9.1https://mirror.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-16.9.1-ce.0.el7.x86_64.rpm…

半监督学习能否帮助训练更好的模型?

数据科学家面临的最常见挑战之一是缺乏足够的标记数据来训练一个可靠且准确的模型。标记数据对于监督学习任务&#xff0c;如分类或回归至关重要。然而&#xff0c;在许多领域&#xff0c;获取标记数据既昂贵又耗时&#xff0c;有时甚至是不切实际的。另一方面&#xff0c;未标…

CSS学习18--伸缩布局

伸缩布局 一、伸缩布局二、属性设置 一、伸缩布局 给父级display: flex; 给孩子flex: 1; 自由变动 <html><head><style>section {width: 1000px;height: 200px;border:1px solid pink;margin:100px auto;/*父级盒子添加f1ex*/dispLay:flex;/*伸缩布局模式*/…

HW | AMD GPU上 “nvidia-smi -lms” 的等价指令——MI300X实时查看GPU使用率

文章目录 .实验背景.nvidia-smi -lms.rocm-smi 等价指令.结语. . 实验背景 最近在使用AMD MI300X GPU进行实验&#xff0c;MI300X是目前AMD最先进的几款数据中心GPU之一。该GPU的软件指令和NVIDIA的不同&#xff0c;主要因为底层的驱动命名不同&#xff08;在我理解确实是这样…

小型洗衣机什么牌子好又便宜?五款备受好评机型测评,闭眼入

在日常生活中&#xff0c;内衣洗衣机已成为现代家庭必备的重要家电之一。选择一款耐用、质量优秀的内衣洗衣机&#xff0c;不仅可以减少洗衣负担&#xff0c;还能提供高效的洗涤效果。然而&#xff0c;市场上众多内衣洗衣机品牌琳琅满目&#xff0c;让我们往往难以选择。那么&a…

HarmonyOs 应用基础--Swiper-样式结构重用-GridGridItem

目录 九、Swiper-样式&结构重用-Grid&GridItem 1. Swiper 1.1. 适用场景 1.2. 基本用法 1.3. 常用属性方法 1.4. 调整导航点 1.5. 案例-小米有品 2. 样式&结构重用 2.1. Styles 2.2. Extend 2.3. Builder 2.4. Extend、Styles、Builder 对比 3. 网格布…

opencv图像透视处理

引言 在图像处理与计算机视觉领域&#xff0c;透视变换&#xff08;Perspective Transformation&#xff09;是一种重要的图像校正技术&#xff0c;它允许我们根据图像中已知的四个点&#xff08;通常是矩形的四个角&#xff09;和目标位置的四个点&#xff0c;将图像从一个视…