粗记一次OOM!
OOM
第一次遇到OOM - Out of Memory 内存溢出
我知道你很急,但你先别急,听我说
腾讯云周年庆(终于想起老用户了,不然连人带站转去隔壁阿里云的99包年且续费同价格),然后冲了个丐版的轻量,打算专门跑跑脚本和做试验的
这不最近接触了远程开发嘛,就打算用VSCode连上服务器试下远程开发
很快啊,啪的一下,插件 Remote - SSH
配好之后直接就连上玩了
然后感觉远程开发挺方便的,可以自动保存文件同步更新,也可以在VScode直接运行程序甚至打断点调试
运行着还挺正常,突然间,怎么卡死了,保存文件也一直在转圈,怎么回事……
出问题了
首先是在VScode里面直接卡死,不管是保存文件还是远程的命令,全都无响应,断开重连也是一样,新建终端ssh也登不上去,当时就很迷……
然后就登上了服务器的控制台去看,面板里的监控显示是正常的
网络 IO 硬盘都很低,就是内存高点,在70~80%的样子(我当时还觉得是因为远程开发还运行打断点什么,所以内存高点算正常)
但VScode还是卡死,我就试着点击重启,结果控制台也卡死了…
然后我就觉得是服务器出问题了,就去提交了工单
提交工单
那边的工程师回复我:
一开始我还很懵,”OOM是啥?”
乍一看,好家伙,内存溢出了……
然后我也不知道咋办呀,毕竟真·第一次遇到嘛……
然后就继续问工程师,现在怎么办才好,毕竟还是卡死呀
然后他就叫我尝试用控制台的VNC登录试试
原话是:
建议您下次没有响应的时候参考如下文档使用vnc方式登录您的服务器查看具体是什么程序导出的内存溢出:https://cloud.tencent.com/document/product/1207/46824
我就跟着他说的,试着用VNC登录,结果……
emm……
过了好久之后,终于连上了……
检查溢出的原因
复现
然后我就学着敲工程师的那个查看内存的指令
1 | grep 'Out of memory' /var/log/syslog |
自己复现呈现的:
分析原因
首先是内存炸了的问题
显然是node进程把内存吃完了,但目前运行node的有两个,一个是自己的node程序,还有一个就是VScode自己起的node,远程连接也在消耗资源。
将自己的程序进行单独的运行,很长一段时间都没有问题,内存消耗是很小而且很稳定的,不会突然间吃掉大段的内存从而导致oom。
接着就是单开远程开发,同样是比较稳定的,但内存的消耗很明显比程序高了不少,和之前监控的峰值差不多。
虽然维持在高水平,但一段时间内不动他确实也是挺稳定的。但在此基础上频繁同步文件,还有运行程序,这就会导致内存消耗的加大。
这一点在同步文件的时候特别明显,然后因为文件其实都是直接存在服务器上的,所以一旦没保存成功,在本地也没有另存的话,一关掉终端/VScode 文件就没了,就真的很离谱……
卡死的问题
这里出现了两个卡死,一个是进行远程开发的VScode,一个是控制台。
这里之所以会卡死,是因为他们都需要等服务器进行相应才可以完成操作。
而服务器现在需要等待Linux内核,把高内存的进程kill掉之后 恢复到正常水平,才可以继续做出相应,这段时间服务器本身也是卡死的。
这一卡就要卡快10分钟(内核调度真的要这么久嘛,不了解…)
然后所有的连接、指令在这段时间都会失效,又或者说是排队,但不作响应。
所以VScode和控制台的重启 VNC都会卡主。但其实这里还有一个卡死的是监控,监控记录下来的都是比较平稳的 基本的水平,是因为在真的oom的时候,监控是记录不到的,又或者说就算监控到了 也无法响应到看板