zzxworld

记一次服务器出现大量 TIME_WAIT 连接的处理过程

我的网站部署在阿里云,最近发现服务器时不时的会出现 CPU 飙升的情况。这种情况不是每天都会出现,一般是隔上两三天就会来一次。一旦出现这个问题,服务器就会很卡,而且网站也会无法访问。跟踪了几次,我发现是大量 TIME_WAIT 连接导致的。

一开始我以为是被人 DDoS 攻击了,所以特地在手机上安装了阿里云的 App,时不时的就去刷一下服务器的 CPU 状态,发现有上升迹象就去服务器上看进程和连接。在跟踪到了几次 CPU 飙升时的服务器连接 IP 和状态后。我发现并不是被人攻击了,而是阿里云服务器上默认安装的助手服务有问题。

我是使用 netstat 命令跟踪的服务器连接信息。关于这个命令的使用方法可以参考下面这篇文章:

当在手机上发现 CPU 突破正常运行的最大值时,我就登陆到服务器上用 netstat -nat 命令查看连接 IP 和数量,每次都会发现有大量的 TIME_WAIT 状态的连接。这些连接信息看起来都差不多:

tcp    0   0 xxx.xxx.xxx.xxx:60426    100.100.100.200:443    TIME_WAIT

服务器正常的时候时候没几条,但多的时候会达到上百条。这个信息一看就是服务器本地连接了 100.100.100.200 这个地址的 SSL 端口。问题是我通过 netstat -natp 却又无法定位是本地哪个程序发起了这儿么多 TIME_WAIT 状态的连接。

通过查询 100.100. 开头的这个 IP 地址,我发现这跟阿里云提供的服务有关。所以我开始在 Systemd 服务中查找蛛丝马迹。最终我注意到这样两个服务:

  • aliyun.service
  • AssistDaemon.service

通过 systemctl stop 命令把这两个服务都停了,发现大量的 TIME_WAIT 连接也消失了。CPU 使用率也降了下来。停止以上两个服务后,阿里云也没有给我发来任何服务器异常的提示。所以看起来这个问题是解决了。

但我还不能确定是不是真的解决了,因为这个问题出现不是很有规律,还需要再多观察几天。如果等上十天半个月的不再出现,那应该是真的解决了。