nodejs pm2集群模式配置

Posted 赤羽飞鸿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nodejs pm2集群模式配置相关的知识,希望对你有一定的参考价值。

项目只开一个线程,压力大,又不想开多个端口,就用了pm2集群,把配置记下来,防止下次找不到,但集群也有个麻烦的地方,就是在a线程生产的全局变量,并不能在b线程中找到,互不相通,客户端向服务端请求的时候并不是一直是同一个线程,可能会换的。底下是配置,保存的格式是.json,然后 pm2 start config.json .
  "apps": 
    "name": "processLogin",                             // 项目名
    "script": "processLogin", // 执行文件的路径 ,如:express的www
    "watch": false,                              // 是否监听文件变动然后重启
    "error_file": "/data/logs/web_server/stderr.log",         // 错误日志文件
    "out_file": "/data/logs/web_server/stdout.log",           // 正常日志文件
    "log_date_format": "YYYY-MM-DD HH:mm Z",        // 指定日志文件的时间格式
    "autorestart": true ,               // 默认为true, 发生异常的情况下自动重启
    "exec_mode" : "cluster",
    "instances":"max"      // 开启进程数 可以指定具体进程数,max是cpu的最大核心数量
  

  

Node.JS 内置集群还是 PM2 集群?

【中文标题】Node.JS 内置集群还是 PM2 集群?【英文标题】:Node.JS built in cluster or PM2 clustering? 【发布时间】:2016-03-03 02:09:26 【问题描述】:

哪个更好?

我已经用 worker 激活了 Nodejs 集群模式,但现在我发现 PM2 可以做同样的事情。 我正在使用 keymetrics 从我的网络服务器查看统计数据,我注意到当我在不使用 PM2 集群功能的情况下启动 NodeJS 节点(带有内置集群)时,Keymetrics 报告使用了 20/30MB 的 Ram。

如果我停用集群(在节点内)并打开 PM2 集群,keymetrics 会报告大约 300MB 的 Ram 使用量。

现在,哪种方法更好,为什么内置集群关键指标报告仅 30MB 的 ram 使用量?

【问题讨论】:

【参考方案1】:

这实际上取决于您的 Node 应用程序的工作方式。如果您的application is stateless 则很容易使用 pm2 集群模式,因为它在代码更改方面不需要太多努力(或无需努力)。但是如果您的应用程序使用本地数据、会话或使用套接字,那么建议使用 Node.js 内置集群模块并使用 pm2 正常启动您的应用程序。

我的 Node 应用程序正在使用套接字和 MQTT,因此我不能直接使用 pm2 集群模式 (pm2 start app.js -i max),因为同一节点应用程序将在每个 CPU 上运行,并且它正在与客户端创建多个套接字连接。所以我必须使用节点集群手动管理集群和工作人员,并且必须使用sticky-sessions 和socket.io-redis 之类的节点包来设置所有工作人员之间的正确通信流。然后简单地使用pm2 start app.js启动我的节点应用程序

以下是一些有用的链接。

PM2 Clustur mode PM2 Recommendation Note Node Cluster

【讨论】:

你不能使用 redis 之类的东西来存储你的套接字会话,然后只使用 pm2 吗? 根据 PM2 的开发人员的说法,“您的进程永远不是主进程,因此它无法运行主进程。”这意味着您只能在没有-i 的情况下 pm2 您的应用程序,然后您的应用程序负责管理集群。 github.com/Unitech/pm2/issues/2885 PM2 提供了环境变量,您可以使用这些变量来检查当前进程是主进程还是其中一个工作进程。所以,你绝对可以使用 PM2 集群模式,你只需要在你的代码中使用套接字的部分实现一个简单的if (isMain) 检查。【参考方案2】:

我使用 PM2。它更好的原因有很多。

    与使用核心集群不同,您的代码几乎不需要修改即可使用 PM2。集群逻辑并不适用于我们构建的每个应用。 它从命令行扩展。我可以简单地运行 pm2 scale my-app +1 在部署后实时添加另一个工作人员。 您应该已经在使用 PM2 来保持进程处于活动状态。所以集群是免费的。

我无法复制与您的300MB 号码接近的任何内容。事实上,我最近有一个泄漏的应用程序,我不得不在上面使用--max-memory-restart,即使在这种情况下,内存使用量通常也低于100MB。虽然如果 PM2 的集群使用更多内存,我一点也不感到惊讶,因为它为您提供了很多开箱即用的功能。

我的建议是不要过早优化。使用 PM2,直到您真正需要从系统中挤出每一滴内存/性能(绝对不是在您有大量流量之前)。到那时,您可以确定集群需要的最低限度,并且可以自己重新实现这些部分。

资源

集群演练:https://keymetrics.io/2015/03/26/pm2-clustering-made-easy/ PM2教程:https://futurestud.io/tutorials/pm2-cluster-mode-and-zero-downtime-restarts

【讨论】:

以上是关于nodejs pm2集群模式配置的主要内容,如果未能解决你的问题,请参考以下文章

Node.JS 内置集群还是 PM2 集群?

nodejs面试

如何在插槽IO中使用PM2集群?

PM2入门及其常用命令

Ubuntu 18.04 安装 pm2

PM2 集群模式与节点集群性能