日常Bug排查-连接突然全部关闭

前言

日常Bug排查系列都是一些简单Bug的排查。笔者将在这里介绍一些排查Bug的简单技巧,同时顺便积累素材。

Bug现场

最近碰到一个问题,一台机器上的连接数在达到一定连接数(大概4.5W)连接数之后会突然急速下降到几百。在应用上的表现就是大量的连接报错,系统失去响应,如下图所示:

思路

思路1: 第一步肯定是怀疑代码写错了,笔者看了下,使用的是成熟的框架,不是自己操作的连接,那么代码的问题应该较小。

思路2:那么笔者就开始怀疑是内核的限制,例如文件描述符到顶了之类,但这又有一个矛盾点。一旦是内核对连接数量限制的话,应该是连接数到达一定程度就涨不上去,而不是连接数跳水式下降。

思路2.1: 进一步,笔者就开始想,很有可能是某个间接资源的限制导致到达这个瓶颈后,所有的连接获取这个资源获取不到而导致全部报错。再结合TCP连接消耗的资源无非就是CPU/内存/带宽。

监控信息

有了上面的思路,我们就可以观察相关监控信息了。

CPU监控:CPU消耗很高达到了将近70%,但获取不到CPU一般只会导致响应变慢,和问题现象不匹配。

带宽监控:带宽利用率达到了50%,这个带宽利用率算不上高。

内存监控:确实使用了大量的内存,RSS达到了26G,但是比起128G的内存而言,这点消耗量显然不可能成为瓶颈。

好了,看了这三个数据之后,就发现系统的资源消耗还称不上达到瓶颈。但是,笔者从一开始就怀疑内存的使用可能触发了某个特殊的瓶颈。因为只有内存资源申请不到之后,TCP连接才有可能直接报错进而Drop连接。

TCP监控信息

当传统的监控已经不足以分析我们问题的时候,笔者就直接掏出针对TCP问题最有效的统计命令了,祭出法宝:

# 这条命令详细的输出了tcp连接的各种统计参数,很多问题都可以通过其输出获得线索
netstat -s

笔者在这条命令的输出中详细的观察TCP以及TCP内存相关的输出项,定睛一看,就发现一个很不寻常的地方:

...
TcpExt:
TCP ran low on memoery 19 times
......

这个输出就和笔者对于内存限制的猜想完全对应起来了。TCP内存不够了,导致读取或者写入数据的时候申请内存失败进而将TCP连接本身给Drop了。

修改内核参数

因为笔者之前详细的阅读过Linux TCP的源代码以及其所有的可调整的内核参数。所以对TCP的内存限制有映像。有了GPT之后,只需要知道一个大致的方向就好了,直接问GPT就给出了答案,就是tcp_mem这个参数。

cat /proc/sys/net/ipv4/tcp_mem
1570347 2097152 3144050

这三个值分别代表了tcp对于内存在不同阈值下的不同使用策略,单位是页,也就是4KB。具体解释可以直接去问GPT,在此就不赘述了。核心就是TCP消耗的内存总量在大于第三个值也就是3144050(12G,占128G内存的9.35%)的时候TCP就开始由于内存申请不到而Drop连接。而对应的应用由于每个请求高达好几M确实会让每个TCP连接消耗大量的内存。

在内存消耗过程中一旦超限,那么TCP连接就会被内核强制Drop,这也解释了为什么基本所有连接在很短的时间内就跳水式Drop,因为他们都在不停申请内存,而达到临界阈值后全部都报错,进而整个系统的所有连接都关闭导致系统失去响应。如下图所示:



知道是这个问题就很简单了,直接将tcp_mem调大即可:

cat /proc/sys/net/ipv4/tcp_mem
3570347 6097152 9144050

调整后系统保持稳定

在经过响应的内核调整之后,系统的连接数超过了5W之后依旧保持稳定。这时候我们观察相关的TCP消耗内存页的输出:

cat /proc/net/sockstat
TCP: inuse xxx orphan xxx tw xxx alloc xxxx mem 4322151

从这个输出我们可以看到系统平稳运行后,其常态使用的内存页数量mem为4322151已经远大于之前的3144050,这也从侧面验证了笔者的判断。

对应的内核栈

在此记录下对应的Linux内核栈

tcp_v4_do_rcv
|->tcp_rcv_established
|->tcp_data_queue
|->tcp_data_queue
|->tcp_try_rmem_schedule
|->sk_rmem_schedule
|->sk_rmem_schedule
|->__sk_mem_raise_allocated
|-> /* Over hard limit. */
if (allocated > sk_prot_mem_limits(sk, 2))
goto suppress_allocation;
|->goto drop:
tcp_drop(sk,skb)

可以看到当allocated大于相关的内存limit之后Linux Kernel会将此TCP连接直接Drop。

总结

笔者在了解清楚Bug现场之后,大概花了20分钟就定位到了是TCP内存瓶颈的问题,然后借助GPT非常快速的找到了相关解决方案。不得不说GPT能够大幅加速我们搜索的过程,笔者个人感觉可以在很大程度上替代搜索引擎。但喂给GPT的Prompt还是需要通过Bug现场以及一定的经验来构造,它代替不了你的思考,但能大幅加速信息的检索。

日常Bug排查-连接突然全部关闭的更多相关文章

  1. 日常Bug排查-系统失去响应-Redis使用不当

    日常Bug排查-系统失去响应-Redis使用不当 前言 日常Bug排查系列都是一些简单Bug排查,笔者将在这里介绍一些排查Bug的简单技巧,同时顺便积累素材_. Bug现场 开发反应线上系统出现失去响 ...

  2. 日常Bug排查-消息不消费

    日常Bug排查-消息不消费 前言 日常Bug排查系列都是一些简单Bug排查,笔者将在这里介绍一些排查Bug的简单技巧,同时顺便积累素材_. Bug现场 某天下午,在笔者研究某个问题正high的时候.开 ...

  3. 日常Bug排查-抛异常不回滚

    日常Bug排查-抛异常不回滚 前言 日常Bug排查系列都是一些简单Bug排查,笔者将在这里介绍一些排查Bug的简单技巧,同时顺便积累素材_. Bug现场 最近有人反映java应用操作数据库的时候,抛异 ...

  4. 日常Bug排查-Nginx重复请求?

    日常Bug排查-Nginx重复请求? 前言 日常Bug排查系列都是一些简单Bug排查,笔者将在这里介绍一些排查Bug的简单技巧,其中不乏一些看起来很低级但很容易犯的问题. 问题现场 有一天运维突然找到 ...

  5. WebClient.DownLoadString报错:连接被意外关闭

    调用WebClient的DownLoadString方法调用接口,当数据量比较小的时候(十几条数据)一切正常.后来对方突然放了一千多条数据,然后就报错了:连接被意外关闭. 先是以为是对方接口没有在输出 ...

  6. 记一次排查mysql数据库连接未关闭问题的过程

    在一些项目中由于一些特殊原因仍然保留着显示的获取数据库连接(Connection).提交事务.回滚事务.关闭连接等操作:其中关闭连接是比较容易疏忽又比较难在前期发现的问题. 我是如何排查连接未关闭的问 ...

  7. C#使用FtpWebRequest 基础连接已经关闭:连接被意外关闭(The underlying connection was closed:The connection was closed unexpectedly)

    公司内部开发的winform程序使用了FtpWebRequest下载FTP服务器的文件到本地. 大多数人运行良好,由于我们是试运行逐步有人加入到平台的使用,前两天突然有个别机器无法连接FTP服务器报出 ...

  8. 我为 Netty 贡献源码 | 且看 Netty 如何应对 TCP 连接的正常关闭,异常关闭,半关闭场景

    欢迎关注公众号:bin的技术小屋,本文图片加载不出来的话可查看公众号原文 本系列Netty源码解析文章基于 4.1.56.Final版本 写在前面..... 本文是笔者肉眼盯 Bug 系列的第三弹,前 ...

  9. 解决Mysql连接池被关闭 ,hibernate尝试连接不能连接的问题。 (默认mysql连接池可以访问的时间为8小时,如果超过8小时没有连接,mysql会自动关闭连接池。系统发布第二天访问链接关闭问题。

    解决Mysql连接池被关闭  ,hibernate尝试连接不能连接的问题. (默认MySQL连接池可以访问的时间为8小时,如果超过8小时没有连接,mysql会自动关闭连接池. 所以系统发布第二天访问会 ...

  10. WCF项目中出现常见错误的解决方法:基础连接已经关闭: 连接被意外关闭

    在我们开发WCF项目的时候,常常会碰到一些莫名其妙的错误,有时候如果根据它的错误提示信息,一般很难定位到具体的问题所在,而由于WCF服务的特殊性,调试起来也不是那么方便,因此往往会花费不少时间来进行跟 ...

随机推荐

  1. #ST表#CF1879F Last Man Standing

    洛谷题面 CF1879F 分析 当 \(x\) 大于最大值时一定可以被约化为等于的情况,考虑枚举 \(x\), 通过枚举倍数的方式可以知道存在若干段区间消耗同一精神状态的次数是相同的,那么区别就是其精 ...

  2. 小师妹学JavaIO之:文件编码和字符集Unicode

    目录 简介 使用Properties读取文件 乱码初现 字符集和文件编码 解决Properties中的乱码 真.终极解决办法 总结 简介 小师妹一时兴起,使用了一项从来都没用过的新技能,没想却出现了一 ...

  3. DOM(文档对象模型):理解网页结构与内容操作的关键技术

    DOM(文档对象模型)定义了一种访问和操作文档的标准.它是一个平台和语言无关的接口,允许程序和脚本动态访问和更新文档的内容.结构和样式.HTML DOM用于操作HTML文档,而XML DOM用于操作X ...

  4. HMS Core机器学习服务身份证识别功能,实现信息高效录入

    在各类App都要进行实名制的当下,进行身份认证自然不可避免.平时购买火车票.飞机票,住酒店.打游戏等都需要身份认证,如果每次都要输入那18位的身份证号十分麻烦,手一抖就会出错.因此,使用华为机器服务身 ...

  5. Windows XP Vmware 无法自适应窗口

    之前在吾爱破解上找到一个 WindowsXP SP3 的精简系统(目前找不到在哪了),自带 VMtools 和 52 破解工具包,很适合 XP 系统下的逆向和病毒分析.目前准备学习一下<恶意代码 ...

  6. 不常用的技能-【手动编译java类】

    jdk版本:1.7 冒号分割jar包,1.8 分号分割jar包 javac -classpath fastjson-1.2.24.jar:jedis-2.9.0.jar Test.javajava - ...

  7. 配置服务器SSH PAM防止暴力破解

    正常机器如果开启ssh可能会被暴力破解用户密码,可以配置ssh的pam限制登录失败时可以锁定用户一段时间,就算密码输入正确也无法登录,等恢复之后才可以再次进入,对于不同的发行版配置可能略有不同,对于r ...

  8. javascript现代编程系列教程之二——IIFE

    IIFE(Immediately Invoked Function Expression,立即执行函数表达式)是一个在定义后立即执行的JavaScript函数.它具有以下特点: 是一个匿名函数:通常情 ...

  9. 一种关于低代码平台(LCDP)建设实践与设计思路

    简介: 作者在负责菜鸟商业中心CRM系统开发过程中发现有一个痛点:业务线很多,每个业务线对同一个页面都有个性化布局和不同的字段需求,而他所在的团队就3个人,那么在资源有限的情况下该如何支撑呢?本文就降 ...

  10. 【Serverless实战】B站每日自动签到&&传统单节点网站的Serverless上云

    简介: Serverless好哇!这里将针对个人与生产两个应用方向的测评 使用Serverless实现自动获取每日B站的经验值,让你更快冲到LV6! 你的业务站点还是一台服务器All in One吗? ...