记一次'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了,后面要为自己服务建立冗余与和恢复机制。
- 没在服务器上生成静态文件了,直接在本地生成,传静态文件上去。
- 把机器的磁盘加大了。