记一次'hexo g'卡死机器

背景

和往常一样写完博文,运行hexo g生成静态文件。
然后突然就卡死了,不输出任何数据。

现象

ssh也连不进去,显示Connection established.,但服务器没有任何数据返回。
ss,vpn,http,https的所有的端口都是可以达成连接,也是服务器没有返回数据。

于是怀疑过服务器挂掉,服务器磁盘满了卡住,主机维护,gwf屏蔽,受到ddos。
但可能性都不大,服务器挂了应该tcp连接都不法达成。
gwf屏蔽可能tcp应该是连接重置,ddos更加没可能性。

进一步排查

用服务器内网的机器连ssh,也连不上去,排除外网链路上的问题
登录上服务器的控制台。

现象:
cpu 占满
磁盘读属于在较高水平
磁盘写属于在较低水平
网络数据流量在在较低水平
内在占用控制台上没有统计

在查了40分种之后,又发现ssh可以连上去了。

当时不觉得是运行’hexo g’的问题。
发现正常之后,以为是主机维护。
静态文件还没有生成成功,于是再次运行。
结果又卡死了。
这样才定位的确是这个命令引起的。

重现

为了重现这个过程
新建一台一样的机器,把环境重新搭建,复制服务器上的数据。
运行”hexo g”,并没有重现。
多次运行,也没有出现这个情况。
测试在hexo g运行时间cpu是占满的,内存只增量占用200M,运行完后这200M又想法释放了。
所以觉得与自己服务器上的环境相关。

在第二次卡死又正常之后,又进行了第三次命令的执行,又卡死了。
在这台上是稳定重现。
第二天,只好把服务器重启试试。
重启之后,第一次运行命令就是正常的,第二次就又卡死了。

找相关原因

在搜索引擎上找一下,只发现了一篇相关的问题
https://cnodejs.org/topic/5743f7c4754d17df1e44d97d
好像问题不出在hexo

相关原因的猜想

猜想1:
hexo过于占内存,在某些时刻内在存分配失败。
造成hexo发生死锁。占满 cpu,使cpu不能处理别的进程。

猜想2:
在生成静态文件的时候是cpu密集的操作。
但我的机器是共享cpu类型的便宜机器。
虚拟化主机发现机器对cpu进行独占时间过长。
对主机进行了限制。

2017_06_29补充

后来自己内网的机器也发生过几次这样卡死现象。
都是在自己运行多个服务的时候。
查了下虚拟机的监控。证实确实是内存用完了,会出现这样现象。

监控图

吸取的经验

  • 一台机器挂了之后,这上面的所有服务都gg了,后面要为自己服务建立冗余与和恢复机制。
  • 没在服务器上生成静态文件了,直接在本地生成,传静态文件上去。
  • 把机器的磁盘加大了。