事情是这样的,昨天晚上我收到了腾讯云的异地登录告警,一开始我并不是太在意。腾讯云经常会有一些误报告警,不怪腾讯云,有时候我带着笔记本回老家,笔记本竟然没睡死,在合上的状态连上了我的服务器(目测是 VSCode 远程开发),而老家的电信宽带竟然有时候 ip 是其他城市的,就会引起异地登录报警。
然而这次的告警收到的时候我正在深圳家里电脑前,没有移动设备,而且 IP 也十分诡异,查询为拉脱维亚的 IP。以为是密码泄露,登上去草草改了密码就睡觉了。
第二天起来看 log,发现第一次登录只有一个 disconnect 的 log,我就在想这个异常 IP 到底是不是真的有成功登录我的机器呢,找了腾讯云安全的大佬们协助排查。后来发现第二次的登录有完整的 log,可以明显的看到 Accept 了来自公钥的登录。使用的公钥来自我另一个机器上(后称为 B 机器)的用户密钥对。
告警的机器我们把他叫做 A,A 机器是最近新购的,腾讯云最近 SA2有优惠啊,于是买了一台,准备把老机器 B 停止续费,迁移数据和服务换到价格更便宜配置更高的 A 机器。迁移过程完全是手工操作,没有粗暴的对拷数据,认真的整理了哪些服务已经不需要了,也重新规划了目录结构和权限。为了方便迁移数据(我使用 scp 拷贝),我把 B 机器的公钥添加到了 A 机器的authorized_keys 中,因此 B 机器是可以直接免密 ssh 到 A 机器的。
后来在腾讯云的管理控制台上发现我断连无法接上的时候,云监控里面连上报数据都没有,显示缺失了数据。但是可以大致看到出现这个情况前 CPU、内存、IO 迅速爬升直到爆满,当 CPU 下来的时候就自愈了。考虑到我这个是腾讯云底配1C1G 的机器,资源紧张是很正常的,但我还是想看看是哪个鬼把资源耗尽了,于是我做了一个小脚本。
脚本内容很简单,每5秒把 top 的结果打到文件里面,保留最近30分钟的记录。果然没过几天情况又出现了,这时候试了下腾讯云 VNC 的控制台还可以勉强登上机器,只是比较慢,实时看 top 的时候发现 wa 很大,负载巨高,内存也所剩无几。大致可以瞄到是 gopls 进程和 vscode 远程开发相关的 node 服务占了大部分。