pm2的一些小总结

641 阅读2分钟

pm2这个进程管理器是越来越好用了,最新的版本已经支持docker,不过我不看好,docker镜像内的node进程挂掉就应该让集群管理器去处理,简单有效,并且也准守Fail fast这个准则。

正文开始,我把最近用到的几个点总结下

使用yml配置文件

还在使用json文件来配置么?放弃吧,yml更友好,更具可读性,配置项也跟json保持一致。
pm2.keymetrics.io/docs/usage/…

设置最大内存

不知道你是否了解node.js的内存限制,一般默认的大小为1.76G(64bit机器),一旦超过,就会自动崩溃,并且在*nix平台上生成core.pid文件,所以有时候你会看到working dir中生成了一堆的core文件,不妨用file命令看下,相信你会发现都是node进程生成的。

解决方案很简单,pm2设置max-memory-restart参数,这个值必须小于1.76G。当然了,如果你确实需要大内存,可以设置node参数:--max-old-space-size=xxxM,这个值可以随便设置,但建议多测试后再决定,可能大内存限制下会出些问题。

拓展一下

关于core文件,本来是用来调试段错误的,但是如果你不是写C++ AddOn,或者调试什么node的bug,那么可以禁用掉:用Linux本身的方案来解决。

  1. 限制大小:ulimit -c filesize(单位是kb),超过会被裁减;
  2. 更改生成的core路径以及文件名;

默认情况下,/proc/sys/kernel/core_pattern为core, /proc/sys/kernel/core_uses_pid为1,即生成的core文件默认为working dir中的core.pid。
如何修改:

%%	单个%字符
%p	dump进程的进程ID
%u	dump进程的用户ID
%g	dump进程的组ID
%s	导致core dump的信号
%t	core dump的时间
%h	主机名
%e	程序文件名

echo '/data/core-files/core.%t.%p' > /proc/sys/kernel/core_pattern

禁用pid拓展名

echo 0 > /proc/sys/kernel/core_uses_pid

当然了,都是临时的,永久修改需要编辑/etc/sysctl.conf,加入如下两行:
kernel.core_pattern = /data/core-files/core.%t.%p
kernel.core_uses_pid = 0

自启动脚本

不知道你是否每次重启之后是怎么启动pm2的,但是如果不是自动启动的就有点落后了。如果用init.d或者systemd,那也不错,也就维护有点小麻烦,每次调整都得更新脚本。其实pm2已经有了相关的命令来帮你完成这一系列的操作:

生成自启动脚本

pm2 startup centos(ubuntu, centos, redhat, gentoo, systemd, darwin, amazon之一,具体请看文档)

生成dump.pm2文件

pm2 save(或者dump

经过这一步之后,机器重启之后,就能保证pm2自动启动了。

crash恢复

pm2 resurrect

不过,这个命令不适合手工去用的,可以设置个crontab脚本,一旦检测到pm2 daemon的进程不存在,则执行这个命令。