远程主机强迫关闭了一个现有连接,这句提示,我第一次见到它的时候,我整个人是懵的。当时我还在捣鼓我的那个小工具,就是一个内部用的数据报表生成器。用户一跑报表,尤其是数据量大的时候,隔上一会儿就弹出这么一句。我就觉得邪了门了,我代码里没写任何主动断开连接的地方,怎么就给强制关了?
那阵子我真是吃不香睡不头发都掉了好几根。我先是把自己的代码翻了个底朝天,从前端到后端,每一个和数据交互的地方都仔细盘了一遍。检查数据库连接池,是不是我哪里没释放好资源?检查我的API接口,是不是请求太久超时了?但无论我怎么看,都觉得自己的逻辑没问题,该关的都关了,不该关的也都在好好
第一次觉得问题不在我这儿
后来发现,不光我的报表会这样,有同事的同步工具跑久了,也有类似的问题。那我就开始觉得,这玩意儿估计不是我一个人代码的问题。我开始到处问,到处查。那时候才慢慢摸到一点门道,这句提示,通常是你的电脑和对面服务器,也就是“远程主机”之间,连接被对面给咔嚓了。
我就想了,对面凭啥把我连接咔嚓了?我又没惹它!后来慢慢琢磨,也踩了不少坑,才算把这背后的几个原因给搞清楚了。
-
小编温馨提醒:本站只提供游戏介绍,下载游戏请前往89游戏主站,89游戏提供真人恋爱/绅士游戏/3A单机游戏大全,点我立即前往》》》绅士游戏下载专区
网络不或者直接断了:这个是最常见也最容易理解的。比如你突然断网了,或者wifi信号差得要命,断断续续的,对面服务器一看,你这边半天没个动静,可能就会把你这个连接给掐了。这就像你打电话,对方半天不说话,你可能以为断线了,就先挂了。服务器可没那么客气,直接就强行挂断了。
- 服务器那边出事儿了:这我可没少碰到。有一次,我的报表服务突然就一直报这个错。我登录服务器一看,好家伙,内存直接爆了,我的应用程序崩了,然后又被守护进程自动重启了。那它重启了,之前跟它建立的所有连接不就全断了吗?还有可能就是服务器重启了,或者网络设备比如防火墙,交换机啥的,突然出了故障,把连接给切了。这种问题就得去服务器上翻日志,看系统日志或者应用日志,才能找到蛛丝马迹。
- 对面的程序主动把你踢了:有时候不是服务器硬件出问题,是服务器上跑的应用程序它自己把你给断开了。比如你连接数据库,如果长时间没操作,数据库为了节省资源,可能会有个“空闲连接超时”的设置,时间一到就把你的连接给杀了。或者你的请求超出了服务器应用程序能处理的范围,比如你一次性请求了十个G的数据,服务器吃不消,为了不让它自己也崩掉,可能就先把你的连接给断了。
- 防火墙搞的鬼:这个也特别坑。有时候网络中间会经过防火墙,防火墙为了安全或者性能考虑,可能会设置一些规则,比如长时间没活动(也就是空闲)的连接,它就给你干掉。我记得有一次,就是因为中间有个旧的防火墙,对长连接支持不只要超过几分钟不发送数据包,它就默认你这个连接是死连接,直接给你断掉了。搞得我找了半天,才发现是防火墙在背后捅刀子。
- 资源耗尽:你这边的电脑或者服务器,如果TCP连接开得太多,或者内存CPU都快用光了,系统没法好好维护连接了,也可能自己就把一些连接给强行关闭。不过这个情况比较少见,一般是你的程序写得不规范,或者并发量实在太大了,资源不够用才会出现。
我怎么折腾和解决的
知道了原因,我才知道该从哪儿下手去解决了。我一般都是这么排查的:
-
先检查网络:最简单的就是
ping一下远程主机,看看是不是通的,丢包严不严重。再用tracert(Windows)或者traceroute(Linux)看看网络路径,有没有哪个环节特别慢或者不通。 - 看服务器日志:这是重中之重。出了问题我第一反应就是去服务器上翻日志,系统日志、应用日志、Web服务器日志(比如Nginx、Apache的日志),挨个翻,看有没有什么ERROR或者WARNING。往往都能从日志里找到线索,比如内存溢出、程序崩溃、数据库连接断开等等。
-
调整超时设置:如果怀疑是长时间没活动被断开,我就会去调整应用程序或者服务器的超时设置。比如数据库连接的空闲超时时间,或者Web服务器的
keepalive_timeout。让连接可以保持更久一点。 - 优化程序:如果发现是请求量太大或者数据量太大导致的,那我就得回头优化我的代码了,分批处理数据,减少单次请求的负载,或者改进算法。
- 找网络同事帮忙:如果上面这些都查不出什么头绪,那多半就是网络层面的问题了,比如防火墙配置不当。这时候我就直接找网络组的兄弟们,描述清楚问题,让他们帮忙查查是不是网络设备做了手脚。
这玩意儿虽然烦,但一旦你理解了它背后的可能原因,排查起来就没那么玄乎了。就像我,从刚开始一脸懵逼,到后来能对着这句提示,快速定位问题,靠的都是一次次被它折磨,然后一次次去深挖、去解决。现在再看到这玩意儿,虽然还是有点不爽,但至少知道该从哪儿,往哪儿使劲了。



