pm2原理与使用

news2024/10/5 15:28:14

目录

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 服务器并监听端口 8000
  http.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.coloradmin.cn/o/636476.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring Boot - 自定义 banner

自定义 banner 在Spring Boot中&#xff0c;你可以通过定制Banner来个性化你的应用程序启动时的输出。Banner是一个在应用程序启动时显示的ASCII艺术字形式的标志&#xff0c;用于增加应用程序的识别度和个性化。 以下是一些定制Banner的方法&#xff1a; 创建自定义Banner文…

Echarts5.x词云图报错[ECharts] Unkown series wordCloud

问题原因 echarts2.0版本之后不再在引入的echarts中支持wordCloud,需单独引入。引入原js或者min都可以 预期效果 解决方法 https://github.com/ecomfe/echarts-wordcloud/blob/master/dist/echarts-wordcloud.min.js 复制这份文件到utils 然后再使用词云图的页面 import /u…

随机生成验证码

1.servlet代码 /** * 随机生成验证码 * 1.获取Image对象 * 2.1填充背景色 2.2画边框 生成随机角标 2.3写验证吗 2.4 画干扰线 *3.将图片输出到页面 */ package cn.itcast.web.servlet;import javax.imageio.ImageIO; import javax.servlet.*; import javax.servlet.http.*; im…

0基础学习VR全景平台篇第40篇:场景功能-场景加密

功能位置示意 一、本功能将用在哪里&#xff1f; ​ 单密码访问功能&#xff0c;常用于暂未确定的场景内容或暂未交付的项目&#xff0c;使用密码访问保护作品数据的私密性&#xff1b; 或为满足不同情境下的推广需求使用。 二、如何使用本功能&#xff1f; ​ 1、使用加…

CSS3_01:玩转文字渐变特效动画,这篇文章满足你,实现方式+案例完整源码

这里后面会陆续出一个关于css动画系列文章&#xff0c;关注布衣前端&#xff0c;实时获取。 在前端开发过程中&#xff0c;有时候需要特别显示页面某个文字特效&#xff0c;这时普通的文字颜色或者阴影已经无法满足需求。此时&#xff0c;css的线性渐变就派上用场了。 文字渐…

Difference of Normals Based Segmentation

文章目录 例子官网的可视化图片流程C cmakelist 参考 记录翻译一下pcl中的例子 实现的“法线差”功能&#xff0c;用于基于比例的无组织点云分割。 例子 官网的可视化图片流程 C 代码流程&#xff1a; 设置输入点云相关参数。图片左上设置两个半径求取法相量点云&#xff0c…

安装VastBase G100 v2.2 Build 12

1、防火墙设置 1.1 关闭防火墙和selinux 1.1.1 关闭防火墙 systemctl status firewalld.service systemctl stop firewalld.service systemctl disable firewalld1.1.2 关闭selinux vim /etc/selinux/config1.2 修改hosts文件,添加实际的IP地址和主机名 vi /etc/hosts 1.3…

【状态估计】卡尔曼滤波器、扩展卡尔曼滤波器、双卡尔曼滤波器和平方根卡尔曼滤波器研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

win10修改本地host文件,增加自定义本地访问域名127.0.0.1(超详细)

1. 按winR&#xff0c;输入C:\Windows\System32\drivers\etc打开host文件所在位置&#xff1a; 2.右键hosts文件–>点击属性->点击安全&#xff0c;把所有组用户名权限打开&#xff1a; 右键属性切换到安全 配置好之后点击应用-确定 最后验证一下 验证 5. winR&#x…

作为前端开发,你了解MutationObserver吗?

目录 前言 演变过程 基础概念 MutationObserver observe(target, options) attributes&#xff1a;是否监听标签属性变化 childList&#xff1a;是否监听子节点变化 characterData&#xff1a;是否监听文本节点内容的变化 attributeOldValue&#xff1a;是否记录属性变…

前端058_权限系统(身份认证+退出+刷新令牌)_刷新令牌获取新的认证信息

当访问令牌 access_toke 过期,后台会响应状态码 401 ,通过刷新令牌 refresh_toke 获取新令牌。获取后重新发送引发获取新令牌的请求。 1、请求拦截401错误实现刷新令牌请求 所有的请求后台数据,都是通过在 src/utils/request.js 封装的 axios 对象进行发送请求,所以当调…

蓝牙标签协议

1.Request write block size command CMD DATA 0x01 无 Response for write block size command CMD DATA (short) 0x01 Block size 注意&#xff1a;short是低位在前&#xff0c;高位在后 2.Request write screen command CMD DATA 0x02 Image length(int) Imag…

GIS软件中网络分析的5种应用

什么是网络分析&#xff1f;几乎每个人都需要一个网络分析的类型在他们的生活中。 例如&#xff0c;去海滩的最短路线是什么&#xff1f;应该在哪里建一所医院来最好地服务一个社区&#xff1f;如何优化运输车队&#xff1f; 以下是5种最常见的网络分析类型&#xff1a;点对点…

原来Allegro工程师还分这几个等级,薪资差距好大

随着电子设计领域的不断发展&#xff0c;Allegro工程师的需求也越来越高&#xff0c;在发展过程中&#xff0c;不同等级的Allegro工程师之间存在着薪资和工作范围上的差异&#xff0c;那么你知道不同等级的Allegro工程师有什么不同吗&#xff1f; NO.1初级Allegro工程师 ①分布…

HYA-D-M5、HYA-C-01、HYA-D-02气控电磁阀

HY-C-M5、HY-D-01、HY-D-02、HYA-D-M5、HYA-C-01、HYA-D-02、H280-4-D-S-L、H280-5-D-D-L、H380-5-G-S-L、H380-5-D-S-L电磁阀分电控及气控。维护须知&#xff1a; 1&#xff0c;安装时&#xff0c;请注意气体流动方向及接管是否正确&#xff0c;电压是否符合要求2.请注意防尘…

内部知识库搭建的意义何在?可以给哪些内部人员使用?

随着企业的不断发展和壮大&#xff0c;内部知识管理成为了越来越重要的一项工作。而内部知识库搭建则是内部知识管理的重要手段之一。本文将介绍内部知识库搭建的意义以及可供哪些内部人员使用&#xff0c;以及如何搭建一个高效的内部知识库。 内部知识库搭建的意义&#xff1…

拓展冒泡排序

冒泡排序 冒泡排序的动态演示 比较相邻的元素。 1&#xff0c;如果第一个比第二个大&#xff08;升序&#xff09;&#xff0c;就交换他们两个。 2&#xff0c;对每一对相邻元素作同样的工作&#xff0c;从开始第一对到结尾的最后一对。这步做完后&#xff0c; 最后的元素会是…

解决Antd Tree组件,二次点击时不取消选中,保持高亮

一、问题概述 ant design 提供的 Tree树组件 支持点击高亮树节点&#xff0c;再次点击取消高亮。 默认效果如下&#xff1a; 然而大多数业务场景下&#xff0c;我们希望多次点击同一个节点不会取消他的选中效果。 二、解决方案 监听onSelect时间&#xff0c;并使用select…

PG系列1:windows下安装PG15

文章目录 一. 下载PG二. 开始安装PG2.1 开始安装2.2 验证 一. 下载PG 官网地址: https://www.postgresql.org/选择Download 选择windows Download the installer 点击下载 二. 开始安装PG 2.1 开始安装 这个安装很简单&#xff0c;直接下一步即可&#xff0c;此处…

5.Java内存模型之JMM

Java内存模型之JMM 5.1 先从大场面试开始 你知道什么是Java内存模型JMM吗&#xff1f; JMM和volatile他们两个之间的关系&#xff1f; JMM没有那些特征或者它的三大特征是什么&#xff1f; 为什么要有JMM&#xff0c;它为什么出现&#xff1f;作用和功能是什么&#xff1f; hap…