Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

进程管理器pm2运维小结 #33

Open
xizhibei opened this issue Dec 18, 2016 · 0 comments
Open

进程管理器pm2运维小结 #33

xizhibei opened this issue Dec 18, 2016 · 0 comments
Labels

Comments

@xizhibei
Copy link
Owner

xizhibei commented Dec 18, 2016

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

正文开始,我把最近用到的几个点总结下,(之前的 #4 也有一些总结) 。

使用yml配置文件

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

设置最大内存

不知道你是否了解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的进程不存在,则执行这个命令。

@xizhibei xizhibei changed the title pm2运维小记 进程管理器pm2运维小结 Dec 18, 2016
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant