一次对进程大量积压 ESTABLISHED 链接的排查手记

背景

我们都知道,基于Kubernetes的微服务,大行其道,传统部署模式一直都在跟着变化,但其实,在原有业务向服务化方向过度过程中,有些场景可能会变得复杂。

比如说:将Kubernetes的模式应用到开发环节上,这个环节需要频繁的变更代码,微服务的方式,可能就需要不断的:

改代码->构建镜像->镜像推送->部署->拉去镜像->生成容器

尤其是PHP的业务,不需要构建二进制,仅需要发布代码,因此,如果按照上面的部署方式,就需要频繁改代码,走构建镜像这个流程,最后再做发布,这在开发环节就显得过于麻烦了,换而言之,有没有办法,能让开发直接将代码上传到容器中呢?

其实是有的,就是设计一个FTP中间件代理,让用户本地改完代码,通过FTP客户端(很多IDE是支持FTP的)直接上传到容器内部,甚至于用户保存一下代码就上传到容器内。

因此,这就引出了今天的主角,是我基于FTP协议+gRPC协议自研的FTP代理工具。

这个工具上线后,服务全公司所有研发,经过一段时间运行和修补,相对稳定,也做了一些关于内存方面的优化,直到又一次,在维护这个FTP代理的时候,发现一个奇怪的问题:

FTP代理进程,监听的是 192.168.88.32 的 21 端口,所以,这个端口对应了多少连接,就表示有多少个客户端存在,通过:

netstat -apn |grep "192.168.88.32:21"

发现,有将近1000个链接,且都是 ESTABLISHED,ESTABLISHED 状态表示一个连接的状态是“已连接”,但我们研发团队,并没有那么多人,直觉上看,事出反常必有妖。

初步分析可能性

感觉可能有一种情况,就是每个人开了多个FTP客户端,实际场景下,研发同学组可能会使用3种类型的FTP客户端

PHPStorm:这个客户端(SFTP插件)自己会维护一个FTP长连接。
Sublime + VsCode,这2个客户端不会维护链接,数据交互完成(比如传输任务),就主动发送 QUIT 指令到FTP代理端,然后所有链接关闭。很干净。

另外,使用PHPStorm的话,也存在开多个IDE创建,就使用多个FTP客户端连接的情况。
为了继续排查,我把所有对 192.168.88.32:21 的链接,做了分组统计,看看哪个IP的连接数最多

# 注:61604 是 ftp代理的进程ID
netstat -apn|grep "61604/server"|grep '192.168.88.32:21'|awk -F ':' '{print$2}'|awk '{print$2}'|sort|uniq -c |sort

上面的统计,是看哪个IP,对 192.168.88.32:21 连接数最多(18个)。

统计发现,很多IP,都存在多个链接的情况,难道每个人都用了多个IDE且可能还多IDE窗口使用吗?于是,挑了一个最多的,找到公司中使用这个IP的人,沟通发现,他确实使用了IDE多窗口,但是远远没有使用18个客户端那么多,仅仅PHPStorm开了3个窗口而已。

初步排查结

你可能感兴趣的:(后端,Linux,established,tcp,排查,链接,积压)