pm2原理与使用

news/2024/11/25 11:41:32/

目录

pm2是什么以及好处

原理

Node Cluster

pm2工作流程

常用命令

安装

启动进程

查看进程

重启/删除

日志


pm2是什么以及好处

pm2是一个内建了负载均衡器的node进程管理工具,可以利用它来简化很多node应用管理的繁琐任务,如自动监控进程状态、重启进程、日志存储、负载均衡等,而且使用非常简单。

对于线上项目,如果直接通过 node app 来启动,因为 node 是单线程的,所以如果报错了可能会使项目直接停止,从而导致整个服务崩溃。单线程固然有很多好处,例如避免了进程死锁、状态同步的问题,但一个CPU只能跑一个进程,所以没办法通过增加CPU的方式加快运行速度,这在讲求应用21世纪是不能接受的。

但pm2可以把你的应用部署到服务器所有的CPU上,有效的解决这个问题。

基于pm2的进程管理有诸多优点:

  • 0 秒停机重载

  • 基于nodejs,在Linux、Windows、Mac都可以使用

  • 进程守护

  • 内建负载均衡

  • 实时控制台检测

原理

如果你对node进程十分了解,可以考虑看这篇博文:javascript - 通过Node.js的Cluster模块源码,深入PM2原理 - 前端巅峰 - SegmentFault 思否

Node Cluster

Node 在 V0.8 版本之后引入了 cluster模块,通过一个主进程 (master) 管理多个子进程 (worker) 的方式实现集群。pm2的实现就算基于cluster模块的封装。下面是官网的示例代码(有注释):

const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;
​
if (cluster.isMaster) {// 如果当前进程是主进程console.log(`Master ${process.pid} is running`);
​// 创建与 CPU 核心数相同的子进程for (let i = 0; i < numCPUs; i++) {cluster.fork();}
​// 监听子进程退出事件,并输出日志cluster.on('exit', (worker, code, signal) => {console.log(`worker ${worker.process.pid} died`);});
} else {// 如果当前进程不是主进程,则创建一个 http 服务器并监听端口 8000http.createServer((req, res) => {res.writeHead(200);res.end('hello world\n');}).listen(8000);
​// 输出启动日志console.log(`Worker ${process.pid} started`);
}

其中,cluster.fork()创建子进程,相比于原生Linux中的fork,有以下两个优点:

  1. cluster模块 中,会判断当前进程是否为 master进程,若是,则监听端口,若不是则表示为 fork 的 worker进程,即子进程,不监听端口;而原生fork监听同一端口必定会端口占用。

  2. cluster模块 内置了负载均衡功能,master进程 负责监听端口接收请求,然后通过调度算法(默认为 Round-Robin)分配给对应的 worker进程;而原生fork进程之间没有负载均衡,容易导致惊群现象

“惊群现象”(Thundering herd problem)是指在高并发环境下,当一个共享资源(如文件、缓存、数据库等)的锁被释放时,多个进程或线程同时争抢该资源,导致系统性能急剧下降或出现死锁的现象。

pm2工作流程

下面介绍几个角色:

Satan.js提供程序的退出、杀死等方法

God.js负责维持进程的正常运行,God进程启动后会一直运行

daemon wrapper是一种用于将常规应用程序转换为守护进程(daemon)的工具

RPC通常指的是远程过程调用协议,它是一种用于实现分布式系统中进程间通信的协议。它允许在不同计算机之间通过网络进行通信,使得分布式系统中的各个节点可以像本地调用一样来访问远程服务。

pm2工作时,每次命令行输入时都会执行一次 Satan 程序,然后判断 God 进程是否正在运行,确保 God 进程正常运行后, Satan 会通过 RPC 调用 God 中对应的方法启动服务。

常用命令

安装

npm install pm2@latest -g
pm2 update

启动进程

pm2不止可以挂在node项目,也可以挂在其他的项目,如果可以直接用命令启动,则pm2 start server.js即可,但如果不能这样简洁的启动项目,则可以将所需的命令写入一个xx.sh文件,再pm2 start xx.sh启动项目,这样可以避免pm2的启动命令带大量参数。

pm2 start server.js
pm2 start xx.sh

下面介绍命令后面的参数:

--watch:监听应用目录的变化,一旦发生变化,自动重启。

-i --instances:启用多少个实例,可用于负载均衡。如-i 3或者-i max,则根据当前机器核数确定实例数目。

--ignore-watch:排除监听的目录/文件,可以是特定的文件名,也可以是正则。比如--ignore-watch="test node_modules "

-n --name:指定应用的名称。

-o --output <path>:标准输出日志文件的路径。

-e --error <path>:错误输出日志文件的路径。

-x:用fork模式启动app.js,而不是cluster模式

查看进程

pm2 list可以查看所有进程的状态,如下:

可以继续使用 pm2 show id/name来查看进程的具体信息:

还可以使用pm2 monit命令,进入进程的监视界面:

重启/删除

命令后面可以跟id号,也可以跟进程的名称。

pm2 restart id/name
pm2 restart all // 全部重启
pm2 reload id/name // 0秒重载,适合用于web进程
pm2 reload all
pm2 stop/delete id/name // 停止/删除
pm2 stop/delete all

pm2 save可以保存当前进程状态。

pm2 startup可以保证服务器重启后,项目仍然保留

日志

pm2 logs id/name
pm2 flush // 清空所有日志文件

具体的日志文件可以去 $HOME/.pm2/logs/查看,其中包含了日志文件和错误文件。


http://www.ppmy.cn/news/341553.html

相关文章

面向对象的介绍和内存

学习面向对象内容的三条主线 • Java 类及类的成员&#xff1a;&#xff08;重点&#xff09;属性、方法、构造器&#xff1b;&#xff08;熟悉&#xff09;代码块、内部类 • 面向对象的特征&#xff1a;封装、继承、多态、&#xff08;抽象&#xff09; • 其他关键字的使用…

路由器WiFi密码怎么设置?这样做可以快速设置!

案例&#xff1a;我在外面租房&#xff0c;买了一个路由器&#xff0c;为了不让别人使用&#xff0c;我想设置一个密码。但我不知道如何操作。路由器怎么设置密码&#xff1f;求方法分享&#xff01; 如今&#xff0c;Wi-Fi已成为日常生活中不可或缺的一部分。为了保障个人和家…

i5 10400核显什么水平

i5 10400集成的是HD630核芯显卡&#xff0c;大致相当于GT730的水平。 i5 10400组装电脑怎么搭配更合适这些点很重要看过你就懂了 http://www.adiannao.cn/du i5 10400采用14nm制程工du艺&#xff0c;6核心12线程没跑&#xff0c;L3缓存zhi有所升级&#xff0c;来到了12MB&…

r74800h和i59400h哪个好

锐龙8核R7-4800H处理器&#xff0c;8核16线程&#xff0c;基础频率2.9GHz&#xff0c;睿频最高4.2GHz&#xff0c;Zen 2架构&#xff0c;7纳米制程工艺&#xff0c;12MB的三级缓存&#xff0c;45W的热设计功耗(TDP)&#xff0c;可以保证性能释放强劲 选锐龙r74800h还是i5 9400h…

DCGM-Exporter 安装 显卡监控 Prometheus

DCGM-Exporter 安装 显卡监控 1.使用docker方式2.查看显卡参数3.Prometheus配置文件修改4.grafana仪表板导入 1.使用docker方式 安装显卡驱动nvidia-smi可以查看安装Nvidia Docker docker run -d --gpus all --rm -p 9400:9400 nvidia/dcgm-exporter:2.0.13-2.1.1-ubuntu18.0…

华擎Deskmini 310黑苹果efi引导文件

原文来源于黑果魏叔官网&#xff0c;转载需注明出处。 硬件型号驱动情况 主板华擎Deskmini 310 处理器Intel i5-9400已驱动 内存ADATA DDR4 2666 8GB x 2已驱动 硬盘Samsung SSD 970 EVO 1TB已驱动 显卡Intel UHD Graphics 630已驱动 声卡 瑞昱 英特尔 High Definition …

解决elasticsearch:Exception BindTransportException[Failed to bind to [9300-9400]]

Linux7.4使用elasticsearch2.2.1启动报错&#xff1a; [2018-09-20 23:24:17,887][INFO ][node ] [Paibo] starting ... Exception in thread "main" BindTransportException[Failed to bind to [9300-9400]]; nested: ChannelException[Failed…

java中图片拷贝

package com.test.io01;import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException;public class Test04Pic {public static void main(String[] args) throws IOException {//1.有一个源文件File f1 new File("d:\\bjpow…