Skip to main content

PM2 运行原理

PM2 的核心运行原理是一个常驻后台的守护进程(Daemon) 加上进程间远程调用(RPC) 的架构。它通过这种设计,将进程管理命令与实际运行的应用解耦,实现了强大的进程守护、集群管理和零停机重载等功能。

它的运行原理可以从以下几个核心方面来理解:

🏗️ 核心架构:Client-Daemon 两进程模型

PM2 主要由两个核心进程协同工作:

  1. 守护进程 (Daemon):这是 PM2 的“大脑”和“心脏”,是一个在后台独立运行、永不退出的进程。它负责管理和监控所有由 PM2 启动的应用进程。当你执行 pm2 start 后,真正启动和管理应用的都是这个守护进程。它的核心实现位于 PM2 源码的 lib/Daemon.jslib/God 目录下。

  2. 客户端进程 (Client):这是你每次在终端输入 pm2 命令时短暂运行的进程(如 pm2 start app.js)。它的任务很简单:通过 RPC (远程过程调用) 与守护进程通信,将你的指令(启动、停止、重启等)发送给守护进程去执行,执行完毕后客户端进程通常就退出了。

当你第一次运行 PM2 命令时,客户端会检查守护进程是否存在,如果没有,它会自动通过 spawn 方式创建并启动一个守护进程。

⚙️ 启动流程:一个命令的旅程

pm2 start app.js 为例,其完整的执行流程如下:

  1. 命令解析pm2 CLI 命令被解析,调用 API 模块中对应的方法。
  2. 连接守护进程Client 模块与后台的 Daemon 进程建立 RPC 通信连接。
  3. 发送指令Client 将“启动应用”的命令及其配置(如 app.js)通过 RPC 发送给 Daemon
  4. 创建子进程Daemon 接收到命令后,其核心的 God 模块开始工作。它会根据配置(fork 或 cluster 模式)使用 Node.js 的 child_process.forkcluster.fork API 来创建子进程,从而运行你的应用。

至此,你的应用就在 PM2 守护进程的管理下运行了。

🚀 集群模式 (Cluster Mode) 与负载均衡

PM2 的一个核心优势是内置了负载均衡器。其**集群模式(Cluster Mode)**能让 Node.js 应用充分利用多核 CPU 的能力。

  • 实现原理:PM2 的集群模式基于 Node.js 内置的 cluster 模块。当你使用 pm2 start app.js -i max 时,PM2 会创建一个主进程(Master)和多个工作进程(Worker)。主进程负责监听端口并接收所有请求,然后通过负载均衡算法(默认为 Round-Robin,即轮询算法)将请求分发给各个工作进程处理
  • 使用方式:通过 -i 参数指定实例数。pm2 start app.js -i max 会自动启动与 CPU 核心数相同的进程数。

♻️ 进程守护与自动重启

这是 PM2 作为进程管理器的基本盘。守护进程会持续监控所有子进程的状态。一旦任何一个子进程因为未捕获的异常、系统错误等原因崩溃退出,守护进程会立即根据配置自动重启一个新的进程来替代它,从而保证服务始终在线。

✨ 零停机重载 (Zero-Downtime Reload)

与直接 restart(粗暴地杀死并重启所有进程,会导致短暂服务中断)不同,reload 命令可以实现无缝更新。 它的工作方式是:逐个重启集群模式下的工作进程。它会先启动一个新的工作进程,待新进程成功接管流量后,再优雅地关闭一个旧的工作进程。这个过程逐一进行,始终保证有足够多的进程在提供服务,从而实现零停机更新。

📝 总结

PM2 通过 Client-Daemon 的 RPC 架构实现了解耦与稳定通信;其核心能力源于对 Node.js cluster 模块的封装,提供了集群模式和负载均衡;在此基础上,通过进程守护零停机重载等特性,为 Node.js 应用提供了生产级的进程管理方案。