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

news2024/11/25 18:56:05

基于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.coloradmin.cn/o/2123560.html

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

相关文章

基于SpringBoot+Vue+MySQL的流浪猫狗宠物救助救援网站管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 在当今社会,随着宠物数量的激增及人们关爱动物意识的提升,流浪猫狗问题日益严峻。为解决这一问题,构建一套高效、便捷的流浪猫狗宠物救助救援网站管理系统显得尤为重要。本系统基于SpringBoot…

在VB.net中,TimeSpan有什么属性与方法

标题 在VB.net中,TimeSpan有什么属性与方法 正文 在 VB.NET 中,TimeSpan 结构表示时间间隔,即一段时间,而不表示特定的时间点。TimeSpan 提供了多种属性来获取时间间隔的各个组成部分,以及一些方法来操作这些时间间隔。…

Linux下载新版火狐浏览器,替换默认火狐浏览器,保留桌面任务栏图标快捷方式

Linux下载新版火狐浏览器,替换默认火狐浏览器,保留桌面任务栏图标快捷方式 方式一 替换默认程序入口 下载官方浏览器 火狐浏览器下载地址【官网】 (搞清楚你的Linux系统是32位还是64位) 解压下载的程序包,建议放到/o…

Leetcode面试经典150题-74.搜索二维矩阵

解法都在代码里,不懂就留言或者私信 二分查找,比较简单 class Solution {/**解题思路:每一行有序、每一列也有序,只是整体不是严格有序的,那我们需要找一个点,只能往两个方向走,往一个方向走是…

【docker】命令之镜像操作

一、前言 之前讲解了docker的安装,这里呢接着上面的内容来介绍docker中的相关命令的操作。这里我们更具一个案例就是启动一个nginx(是一个在我们应用市场存在的一个软件包),并尝试对其进行修改,然后发布出去,让别人都能…

Guitar Pro 8.2中文解锁版下载及2024最新图文安装教程

Guitar Pro 8.2中文解锁版是一款深受广大音乐人和音乐爱好者喜爱的吉他打谱软件,帮助所有吉他爱好者学习、绘谱、创作,使用非常简单只需直接在五线谱或六线谱上编辑,即可轻松谱写自己的乐章。 Guitar Pro 8.2中文解锁版基本简介 Guitar Pro 8…

【python】python 安装和 pycharm 安装

1 python 安装 1.1 下载 下载地址:python 官网 1.2 安装 windows 安装为例。 双击.exe文件打开 安装界面 安装完成 1.3 检查安装是否成功 win/start 键r 键 运行窗口输入 cmd 回车 3 输入 python查看 显示版本信息,表示已经安装成功。 …

谷粒商城-P125【gulimall-search】:更改 elasticsearch 版本不生效

谷粒商城-P125【gulimall-search】:更改 elasticsearch 版本不生效 报错信息报错原因解决办法 报错信息 SpringBoot 项目的版本是 2.6.13,默认集成的 elasticsearch 的版本是 7.15.2,我们需要用的版本是 7.4.2。 SpringBoot 版本 SpringB…

pptpd配置文件/etc/pptpd.conf详解

正文共:1111 字 2 图,预估阅读时间:1 分钟 如果要在Linux系统配置PPTP(Point-to-Point Tunneling Protocol,点到点隧道协议)VPN,一般是使用pptpd软件。pptpd命令通常从配置文件/etc/pptpd.conf中…

JavaWeb【day15】--(Maven高级)

Maven高级 Web开发讲解完毕之后,我们再来学习Maven高级。其实在前面的课程当中,我们已经学习了Maven。 我们讲到 Maven 是一款构建和管理 Java 项目的工具。经过前面 10 多天 web 开发的学习,相信大家对于 Maven 这款工具的基本使用应该没什…

Windows安装HeidiSQL教程(图文)

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

Linux:epoll 工作模式

边缘触发(Edge Triggered,简称ET)和 水平触发(Level Triggered,简称LT)是epoll两种不同的工作模式,它们在处理I/O事件时有不同的行为。 1:水平触发(LT)模式 1…

4G MQTT网关在物联网应用中的优势-天拓四方

随着物联网(IoT)技术的飞速发展,各种设备和系统之间的互联互通变得日益重要。MQTT(Message Queuing Telemetry Transport)作为一种轻量级的发布/订阅消息传输协议,因其高效、可靠、简单的特性,在…

从 Greenplum 到 Databend,数据仓库的开源新选择

Greenplum 是知名开源数据仓库项目,曾是大数据分析领域的明星产品,在全球范围内尤其是在国内市场上有着重要的地位。今年 6 月, Greenplum 的 GitHub 仓库突然被改为归档模式,访问权限也修改为只读,用户将失去对源代码…

0910作业+思维导图

一、作业(实现一个闹钟) 1、代码 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//调整标签页大小this->resize(800,400);//lab:显示系统时间…

VS2010程序打包为可执行安装程序

说明 记录一下下次再用时省点事儿,直接进入正题吧 步骤 1. 首先把该装好的软件装好,然后创建一个 安装项目 , 如下图 2. 右键 应用程序文件夹 的 添加 , 如下图可添加要打包的文件(和文件夹,文件夹需要添加文件夹),一般是已经编…

SpringBoot 整合WebSocket 简单实战案例

先是pom.xml添加依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency>PS&#xff1a;application.properties不需要添加任何配置 &#xff0c…

元学习之模型诊断元学习(model-agnosticmeta-learning,MAML)

模型诊断元学习&#xff08;model-agnosticmeta-learning&#xff0c;MAML&#xff09;&#xff0c; 另一个是Reptile。这两个算法都是在 2017 年提出来的&#xff0c;而且都是基于梯度下降法进行优化 的。那我们最常用的学习算法是梯度下降&#xff0c;在梯度下降中&#xff0…

基于VUE的在线音乐播放管理系统

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于VUE的在线音乐播放管理系统3是前后端分离项目&#xff0c;拥有两种角色 管理员&#xff1a;用户管理、收藏管理、歌手管理、歌曲管理、歌单管理、评论管理等 用户&#xff1a;登录注…

解锁生活密码,AI答案之书解决复杂难题

本文由 ChatMoney团队出品 介绍说明 “答案之书智能体”是您贴心的智慧伙伴&#xff0c;随时准备为您解答生活中的种种困惑。无论您在工作中遭遇瓶颈&#xff0c;还是在情感世界里迷失方向&#xff0c;亦或是对个人成长感到迷茫&#xff0c;它都能倾听您的心声&#xff0c;并给…