PM2 集群模式下进程启动耗时优化方案

在前端开发中,我们经常会使用 PM2 来管理我们的 Node.js 应用程序。在生产环境中,为了保证应用的高可用,我们通常会使用 PM2 自带的集群模式,来将多个进程分布在不同的 CPU 中运行。然而,在启动进程时,由于每个 Node.js 进程都需要加载 Node.js 运行时环境并执行初始化工作,因此启动耗时会较长。本文将介绍一些优化方案,以减少在 PM2 集群模式下启动 Node.js 进程的时间。

1. 环境搭建

在进行优化前,我们需要准备一些环境,以便测试我们的优化方案。本文中将使用以下环境:

  • 操作系统:Ubuntu 20.04.2 LTS
  • Node.js 版本:v14.16.1
  • PM2 版本:v5.1.1

首先,我们需要搭建一个简单的 Node.js 应用程序,以便测试启动时间。在项目根目录下创建文件 app.js,内容如下:

----- ------- - -------------------
----- --- - ----------

------------ ----- ---- -- -
  --------------- ---------
---

---------------- -- -- -
  -------------------- --- --------- -- ---- --------
---

-- -- - ----------
------------- -- -
  ----------------- --------
-- ------

在终端中进入项目根目录,使用以下命令启动应用程序:

- ---- ------

我们将看到服务器在启动 5 秒钟后输出 “Init done!”。

接下来,我们将使用 PM2 命令启动该应用程序。在终端中执行以下命令安装 PM2:

- --- ------- -- ---

安装完成后,使用以下命令启动 PM2:

- --- ----- ------

该命令会启动一个 Node.js 进程,并将其加入 PM2 的进程管理列表中。使用以下命令查看 PM2 中运行的应用程序:

- --- ----

我们将看到应用程序正在运行:

----------------------------------------------------------
- ---- - ----     - ------  - --- - ------    - ------   -
----------------------------------------------------------
- ---  - ----     - ------  - --  - ---- --   - --       -
----------------------------------------------------------

现在,我们已经准备好了测试环境。我们可以尝试一下在 PM2 集群模式下启动多个 Node.js 进程需要多长时间。

在终端中执行以下命令启动 PM2 集群模式下运行应用程序的 2 个进程:

- --- ----- ------ -- -

使用以下命令查看 PM2 中运行的应用程序:

- --- ----

我们将看到两个应用程序正在运行:

----------------------------------------------------------
- ---- - ----     - ------  - --- - ------    - ------   -
----------------------------------------------------------
- ---  - -------  - ------  - --  - ---- --   - --       -
- ---  - -------  - ------  - --  - ---- --   - --       -
----------------------------------------------------------

我们会看到每个进程都需要启动 5 秒钟。

2. 优化方案

在 PM2 集群模式下启动多个 Node.js 进程需要启动很多个 Node.js 运行时环境,因此启动耗时较长。为了优化 PM2 集群模式下的进程启动时间,我们可以尝试使用以下方案:

2.1. 使用进程守护来缓存 Node.js 运行时环境

使用 PM2 中的进程守护功能,可以在运行 Node.js 进程的同时,也运行一个本地缓存的 Node.js 运行时环境。这样,在启动新的 Node.js 进程时,不需要每次重新加载 Node.js 运行时环境,可以通过加载本地缓存改善启动时间。

在终端中执行以下命令启动带有进程守护的 PM2:

- --- ----- ------ -- - ------- -----------------------------

该命令将启动一个 PM2 进程守护,并加上 --watch 参数来监测文件变化, --ignore-watch="node_modules" 参数来忽略 node_modules 目录下文件的变化。我们可以在终端中使用以下命令关闭 PM2 进程守护:

- --- ---- --- ---

如果您需要重新启动该服务,可以使用以下命令:

- --- ----- --- ---

我们可以通过在 PM2 中使用 show <name> 命令来查看应用程序、守护进程和缓存进程的详细信息。以下是我们上述命令创建的缓存进程的输出:

--------------------------------------------------------
- ---- - ------      - --------    - ------ - ------    -
--------------------------------------------------------
- ---  - ------      - -           - --     - ---- --   -
--------------------------------------------------------

2.2. 使用 PM2 2.5 版本新增的 cluster_mode 参数

在 PM2 2.5 版本中,新增了 cluster_mode 参数,该参数可以在启动进程时直接将多个进程分布在不同的 CPU 上。这种方式可以显著降低进程启动时间。

在终端中执行以下命令升级 PM2:

- --- ------- -- ----------

然后,使用以下命令启动应用程序:

- --- ----- ------ ----------- - ------ ---- --------------

该命令会启动一个进程集群,其中包含 2 个进程。我们可以通过 --exec node 参数来指定要执行的命令。在这种模式下,PM2 会自动将进程分布在不同的 CPU 核心上。

我们可以在终端中使用以下命令观察启动的进程:

- --- -----

下面是多进程启动的输出示例:

- --- ---- - -- - ---- - ---   - ------    - ------- - ------             - --- - ---       -
------------------------------------------------------------------------------------------
- ---      - -  - ---- - ----- - ------    - -      - --                 - --  - --- --   -
- ---      - -  - ---- - ----- - ------    - -      - --                 - --  - --- --   -

3. 总结

我们介绍了两种优化 PM2 集群模式下进程启动时间的方案:使用进程守护来缓存 Node.js 运行时环境和使用 PM2 2.5 版本新增的 cluster_mode 参数。这两种方案都可以有效地缩短启动时间,提高生产环境的稳定性和性能。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/651bd42d95b1f8cacd371085


猜你喜欢

  • 使用 ES8 中的 Object.getOwnPropertyDescriptors() 方法解决属性定义的不可枚举和不可写问题

    在前端开发中,我们常常需要定义一些对象属性来存储数据或者设置特定的逻辑。然而,在属性定义的过程中,不可枚举和不可写问题可能会让我们遇到一些麻烦。这时候,ES8 中的 Object.getOwnProp...

    1 年前
  • 使用 React 和 Firebase 实现实时数据同步

    前言 React 是一种流行的前端框架,提供了高效可重用的组件和状态管理机制,让开发者可以更加方便地构建复杂的 Web 应用。Firebase 则是一种实时数据库和后端服务平台,提供了实时的数据同步和...

    1 年前
  • 如何使用 ESLint 检测 AngularJS 应用程序

    ESLint 是一个可扩展的 JavaScript 语法检查工具,它可以帮助我们检测代码中的潜在问题和错误。在 AngularJS 开发中,使用 ESLint 可以帮助我们更好地维护应用程序,并且保证...

    1 年前
  • Cypress 单元测试:如何测试你的 Vue.js 应用

    在开发 Vue.js 应用时,单元测试是必不可少的环节。它可以确保你的代码正确性,可以让你在重构代码时更加坚定自信,并且可以提高代码的可维护性。在本文中,我们将介绍使用 Cypress 进行前端单元测...

    1 年前
  • Flexbox 布局、CSS Grid 布局与传统布局的优劣对比

    在 Web 开发过程中,样式布局一直是一个非常重要的问题。前端开发者使用的一些传统布局方式,例如基于浮动和 position 的布局方式,虽然可以实现我们想要的布局效果,但随着更多的设备尺寸以及不同的...

    1 年前
  • 在 Mocha 中使用 Supertest 测试 Express 应用程序

    前言 测试是前端开发过程中非常重要的一环,能够有效地提高代码的质量和稳定性,减少 bug 的出现。其中,自动化测试的最大优点就是能够让我们的测试更简洁、快速且可靠,并能够提高开发效率。

    1 年前
  • Socket.IO 连接中出现连接超时的解决方案

    Socket.IO 是一个实时的网络通信库,可用于构建基于 Web 的应用程序。在使用 Socket.IO 进行前端应用开发时,用户可能会遇到连接超时的问题。在本文中,我们将探讨Socket.IO 连...

    1 年前
  • 如何使用 Koa 框架进行跨域资源共享(CORS)

    跨域资源共享(CORS)是一种浏览器机制,它允许在不同源之间分享数据。在前端开发过程中,使用CORS可以方便地从其他网站获取所需资源。而 Koa 是一个基于Node.js的Web框架,可以帮助开发人员...

    1 年前
  • PWA 实战开发:如何后台管理系统中使用 PWA

    什么是 PWA? PWA 是渐进式 Web 应用程序(Progressive Web Application)的缩写,是一种新型的 Web 应用程序模型,在 Web 应用程序中向前迈出了一步。

    1 年前
  • 解决 Deno 中使用第三方模块导致程序崩溃的问题

    Deno 是一个现代化的 JavaScript 和 TypeScript 运行环境,它可以直接运行 JavaScript 和 TypeScript,还支持使用第三方模块。

    1 年前
  • Hapi 框架在 Windows 环境下遇到的常见问题及解决方案

    Hapi 是一款 Node.js 的 Web 框架,它被广泛应用于 Web 开发。不过,在 Windows 环境下,Hapi 框架可能会遇到一些常见的问题,影响开发进程。

    1 年前
  • Kubernetes 中如何开发自定义 Operator

    本文将介绍如何在 Kubernetes 中开发自定义 Operator 来管理部署和运行应用程序。Kubernetes Operator 是一种自动化管理应用程序的工具,它使用 Kubernetes ...

    1 年前
  • ECMAScript 2021(ES12)中的 Temporal API 及其使用示例

    ECMAScript 2021(ES12)中的 Temporal API 及其使用示例 ECMAScript 2021(ES12)是 JavaScript 语言的一个新版本,它引入了 Temporal...

    1 年前
  • TypeScript 中的 never 类型使用详解

    在 TypeScript 中,任何类型都可以作为任何其他类型的子类型或者父类型。比如,一个 string 类型的变量可以赋值给一个 any 类型的变量,反之也可以。

    1 年前
  • AngularJS 调用 jQuery 插件的方法

    在开发前端项目时,为了提高用户交互体验,我们经常会使用 jQuery 插件来实现各种功能。但是,在使用 AngularJS 进行项目开发时,我们可能会遇到如何调用 jQuery 插件的问题。

    1 年前
  • ES7 引入的 Array#flat 和 Array#flatMap 方法使用指南

    在 ES7 中,添加了 Array#flat 和 Array#flatMap 两个方法来方便地操作数组。这两个方法可以让我们更加方便地对数组进行操作,尤其是在处理多维数组时非常有用。

    1 年前
  • 如何解决 Babel 编译时遇到的一些 TypeError 错误?

    Babel 是一个流行的 JavaScript 编译器,用于将 ECMAScript 2015+ 代码转换为向后兼容的 JavaScript 版本。然而,在使用 Babel 进行编译时,你可能会遇到一...

    1 年前
  • 使用 Enzyme 模拟 React Native 元素遭遇的问题及解决方法

    前言 在 React Native 开发中,使用 Enzyme 进行单元测试可以更好地保证代码的可靠性和稳定性。但是在使用 Enzyme 模拟 React Native 元素时常常会遭遇一些问题,本文...

    1 年前
  • 如何优雅地解决 Mongoose 中的并发问题

    Mongoose 是一种在 Node.js 中使用 MongoDB 的模型设计工具。在开发过程中,我们经常会遇到多个请求同时对同一条数据进行修改的情况,这就需要我们考虑并发的问题。

    1 年前
  • GraphQL:必须要学的技术之一

    前言 近年来,GraphQL 在前端圈内愈发流行,已成为前端工程师必须精通的技术之一。但相信有不少小伙伴和我一样,至今仍然被其所包含的概念、架构和语法所困惑。因此,本篇文章将深入浅出地解析 Graph...

    1 年前

相关推荐

    暂无文章