OOM

第一次遇到OOM - Out of Memory 内存溢出

我知道你很急,但你先别急,听我说

腾讯云周年庆(终于想起老用户了,不然连人带站转去隔壁阿里云的99包年且续费同价格),然后冲了个丐版的轻量,打算专门跑跑脚本和做试验的

配置

这不最近接触了远程开发嘛,就打算用VSCode连上服务器试下远程开发

很快啊,啪的一下,插件 Remote - SSH 配好之后直接就连上玩了

然后感觉远程开发挺方便的,可以自动保存文件同步更新,也可以在VScode直接运行程序甚至打断点调试

运行着还挺正常,突然间,怎么卡死了,保存文件也一直在转圈,怎么回事……


出问题了

首先是在VScode里面直接卡死,不管是保存文件还是远程的命令,全都无响应,断开重连也是一样,新建终端ssh也登不上去,当时就很迷……

然后就登上了服务器的控制台去看,面板里的监控显示是正常的

网络 IO 硬盘都很低,就是内存高点,在70~80%的样子(我当时还觉得是因为远程开发还运行打断点什么,所以内存高点算正常)

监控

但VScode还是卡死,我就试着点击重启,结果控制台也卡死了…

控制台提示

然后我就觉得是服务器出问题了,就去提交了工单


提交工单

那边的工程师回复我:

工单1

一开始我还很懵,”OOM是啥?”

乍一看,好家伙,内存溢出了……

然后我也不知道咋办呀,毕竟真·第一次遇到嘛……

然后就继续问工程师,现在怎么办才好,毕竟还是卡死呀

然后他就叫我尝试用控制台的VNC登录试试

原话是:

建议您下次没有响应的时候参考如下文档使用vnc方式登录您的服务器查看具体是什么程序导出的内存溢出:https://cloud.tencent.com/document/product/1207/46824

VNC1

我就跟着他说的,试着用VNC登录,结果……

VNC2

emm……

过了好久之后,终于连上了……


检查溢出的原因

复现

然后我就学着敲工程师的那个查看内存的指令

1
2
grep 'Out of memory' /var/log/syslog
grep 'kernel' /var/log/syslog

oom1-1.jpg
oom2-1.jpg

自己复现呈现的:

oom1-2.jpg
oom2-2.jpg

分析原因

首先是内存炸了的问题

显然是node进程把内存吃完了,但目前运行node的有两个,一个是自己的node程序,还有一个就是VScode自己起的node,远程连接也在消耗资源。

将自己的程序进行单独的运行,很长一段时间都没有问题,内存消耗是很小而且很稳定的,不会突然间吃掉大段的内存从而导致oom。

接着就是单开远程开发,同样是比较稳定的,但内存的消耗很明显比程序高了不少,和之前监控的峰值差不多。

虽然维持在高水平,但一段时间内不动他确实也是挺稳定的。但在此基础上频繁同步文件,还有运行程序,这就会导致内存消耗的加大。

这一点在同步文件的时候特别明显,然后因为文件其实都是直接存在服务器上的,所以一旦没保存成功,在本地也没有另存的话,一关掉终端/VScode 文件就没了,就真的很离谱……

卡死的问题

这里出现了两个卡死,一个是进行远程开发的VScode,一个是控制台。

这里之所以会卡死,是因为他们都需要等服务器进行相应才可以完成操作。

而服务器现在需要等待Linux内核,把高内存的进程kill掉之后 恢复到正常水平,才可以继续做出相应,这段时间服务器本身也是卡死的。

这一卡就要卡快10分钟(内核调度真的要这么久嘛,不了解…)

然后所有的连接、指令在这段时间都会失效,又或者说是排队,但不作响应。

所以VScode和控制台的重启 VNC都会卡主。但其实这里还有一个卡死的是监控,监控记录下来的都是比较平稳的 基本的水平,是因为在真的oom的时候,监控是记录不到的,又或者说就算监控到了 也无法响应到看板