
我们所有默认的handler都是一层层传递异常,如果我们想都自己处理则重租衫写exceptionCaught,不调用fireExceptionCaught即可,如果调用则到最后的tailContext会打印异常
最近使用 netty 过程中发现了几个比较细节的 Connection reset by peer 异常,做个笔记。
这个场景出现在用 Jedis ping 检测的场景,用完直接 close,服务端稳定出现 Connection reset by peer。
tcpdump 一下就很容易定位到问题所在,客户端收到 PONG 响应后直接发了一个 RST 包给服务端:
查看 Jedis 的氏迹源码发现 socket 有个比较特殊的配置 socket.setSoLinger(true, 0) 。
先看一下 man7/socket.7 的解释:
坦白说不是很明白啥意思。。。
最终在 stackoverflow 上找到歼拆并一个比较容易理解的解释:
简而言之,设置 SO_LINGER(0) 可以不进行四次挥手直接关闭 TCP 连接,在协议交互上就是直接发 RST 包,这样的好处是可以避免长时间处于 TIME_WAIT 状态,当然 TIME_WAIT 存在也是有原因的,大部分评论都不建议这样配置。
这个场景有点儿微妙,首先得理解一下 tcp 的两个队列。
这篇文章讲得比较清楚: SYN packet handling in the wild
accept 队列满通常是由于 netty boss 线程处理慢,特别是在容器化之后,服务刚启动的时候很容易出现 CPU 受限。
为了模拟这个现象,我写了个示例程序 shichaoyuan/netty-backlog-test ,设置 SO_BACKLOG 为 1,并且在 accept 第一个连接后设置 autoRead 为 false,也就是让 boss 线程不再继续 accept 连接。
启动第一个 Client,可以正常连接,发送 PING,接收 PONG。
启动第二个 Client,也可以正常连接,但是没有收到 PONG:
可见这个连接创建成功了,已经在 Accept Queue 里了,但是进程没有 accept,所以没有与进程绑定。
启动第三个 Client,也可以正常连接,也没有收到 PONG:
与第二个连接一样。
启动第四个 Client,也可以正常连接,但是在发送 PING 后出现 Connection reset by peer:
这个连接在服务端并没有进入 accept queue,处于 SYN_RECV 状态,并且很快就消失了(因为 accept queue 已经满了,无法转入 ESTABLISHED 状态)。
抓包看一下:
从客户端视角来看连接确实是建成功了,有御悔一个比较特殊的地方在三次握手之后,服务端又向客户端发送了一个 [S.],客户端回复了一个 [.],这个交互看起来不影响连接。
服务端后来销毁了连接,而客户端还认为连接是 ESTABLISHED 的,发送 PING 消息,服务端自然得回复一个 RST。
PS:我在 Windows 10 的 WSL2 中实验这种场景是建连接超时,可能不同的 *** 作系统或 linux 版本对这个交互的过程处理不同,在此不进行进一步测试了。
以上,这个故事告诉我们判断连接是否可用,建成功之后应该发个心跳包测试一下。
1、蓝屏前下载了什么软件、补丁、插件、驱动等全部卸载试试,如果是驱动不合适,请下载驱动精灵升级驱动。 2、如果电脑有木马,请下雹纳银载Win清理助手、金山卫士、360急救箱查杀木马。 3、如果不经常出现蓝屏关机在开机就可以了,还是不行,请开机按F8不动到高级选项出现在松手,选“最近一次的正确配置”回车修复,在不行还原一下系统或重装系统。 4、如果是硬件问题引起的,或超频了硬件将BIOS电池放电(恢复BIOS出厂默认值)建议插拔一下显卡、内存等硬件,清理一下电脑里的卫生,并且擦亮显卡、内存的金手指(在测试一下硬件的温度是否过高)。 5、电脑在光驱读盘时被非正常打开可以导致蓝屏,一般将光盘重新放入光驱即可。电脑在带电插拔某设备时可以导致蓝屏,重启一下电脑修复或按上面第三项修复。 6、还有就是硬盘是否有问题,用系统自带的功能修复一下或下载软件修复硬盘坏道,或格式化硬盘重新分区重装系统,还是不行就需要换硬盘了。 7、最近升级了硬件,这些硬件与系统不兼容,比如:内存、显卡等,请更换硬件试试(到升级硬件的地方更换合适为止)。 8、如果是硬件问题引起的,自己又找不出问题所在,建议到维修那里茄段检修一下。 9、玩游戏蓝屏,一般是游戏本身的问题,电脑的配置与游戏有冲突,显卡、显卡驱动不合适,CPU、显卡的温度过高,内存太小等引起的,另外就是在玩游戏、看视频时,同时在干别的 *** 作最容易蓝屏,因此在玩游戏、看视频时不要在 *** 作别的东西了(看视频蓝屏问题同上)。 10、你可以补充说明,解决蓝屏是需要对电脑蓝屏前的表现和你的 *** 作来分析出蓝屏大概的原因(有问题请你追问我)。 电脑不要满负荷 *** 作,就是在玩游戏、看视频时、看网页的同时在干别的 *** 作最容易死机、蓝屏,因此源宴在玩游戏、看视频、看网页时不要在 *** 作别的东西了。欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)