Nuxt3+PM2集群模式启动及勘误

news/2024/10/14 8:53:32

起因

之前写过一篇 Nuxt3 的文章,Nuxt3 环境变量配置,用到了 PM2,但是里面的一些配置存在问题,最近有空又验证了一下,这里做一个勘误。

问题

PM2 的启动配置中有一项是exec_mode,默认是fork,另一个可选值是clusterfork 是单进程模式,cluster 是多进程模式,也就是常说的集群模式。

最早开始用 Nuxt3 的时候,还在内测阶段,当时找到的资料很多都是基于 Nuxt2 的,Nuxt3 的文档也不是很全,所以很多配置都是参考 Nuxt2 的,有点病急乱投医了,最后拼凑出一套能正常启动的配置就没有再调整了,详情可以看之前的文章,这里把有问题的字段挑出来。

{exec_mode: "cluster",instances: "max", // Or a number of instancesscript: "npm",args: "start",
}

这里的配置造成了什么问题呢?首先可以看出来是通过 npm 来启动程序的,通过npm run start这个命令来执行package.json中的start脚本node .output/server/index.mjs,首先这样是可以启动的,但是存在一些问题:

服务器偶尔会出现 CPU 占用过高的情况,查看 CPU 占用情况发现是 node 进程,于是定位到 PM2,查看运行情况发现多个进程只有一个启动成功,其他的进程都在反复重启,CPU 自然升高。再去查看日志发现是因为端口被占用导致只有一个进程能启动成功,这时我意识到配置可能有问题,不过当时没有时间调整,于是一直以来都是通过手动停止其他进程来解决问题。

解决

有问题当然要解决,集群模式我接触的不多,但既然有这个配置,肯定不会因为端口占用就无法启动,Nuxt3 至今已有较大的版本变化,于是我再次翻看 Nuxt3 的文档,看下官方是怎么配置 PM2 的:

docs/getting-started/deployment

module.exports = {apps: [{name: "NuxtAppName",port: "3000",exec_mode: "cluster",instances: "max",script: "./.output/server/index.mjs",},],
};

最早我是没觉得问题出在启动脚本这的,直到我又找到一个 github 上的 issue Port Already in Use in Cluster Mode,包括里面关联的问题都提到了不应使用 npm 来启动,而是直接使用脚本路径。

You can't cluster application via npm start. To make cluster work, in the script attribute of your ecosystem.config.js, directly put the path of your javascript app.

通过 npm 启动时并没有将这个进程直接托管给 pm2,而是通过 npm 启动了一个进程,pm2 只是监控这个进程,所以 pm2 并不能很好地管理这个进程,上面的截图中也可以看到版本号是 0.39.7,其实这个是服务器上 nvm 的版本,而不是 nuxt3 程序的版本。

关于集群模式

最早我怀疑是集群模式的问题,但即使改成 fork,也还是会出现端口占用的报错,虽然可以通过修改instances来解决,但隐约觉得不是正确的方法,在解决启动报错问题之后,我再次尝试了使用集群模式,不过我仍然不太清楚是否应该使用这个配置,于是我做了一些测试,只是在本地环境的一些测试,结果并不准确,只能做个参考。

instances是要使用的进程数量,它的值可以是'max'-1或其他数字,'max'表示使用最大的实例数,-1表示使用最少的基本就是 1 个,其他数字表示使用指定数量的实例数,这个实例数是根据 CPU 核心数来计算的,比如单核双线程的 CPU,实例数就是 2。

首先我在本地启动了一个 nuxt3 项目,这里模拟服务器环境只用了 2 个实例,然后使用两种不同的 pm2 启动方式执行。

使用pm2 monit监控进程,可以看到这时还没什么区别,这时用 jmeter 进行压测,创建 500 个线程访问集群模式的进程,可以看到两个进程都在运行:

然后同样的压测,但是使用 fork 模式,可以看到只有一个进程在运行:

我并不了解压测,只是简单对比一下,可以看出集群模式的 CPU 波动还是比较明显的,fork 模式 CPU 的波动不明显,但是内存占用会极速攀升,没有截到图。继续增加压测线程,内存的变化并不明显,集群模式的 CPU 占用会更加明显,也有可能是因为压测应用和被压测应用都在本地,所以这个测试结果并不准确,在错误率方面,也没有测出两者的区别。通过简单的测试并没有感受出优劣,集群的优势可能体现在性能和容错方面,在硬件上看不出太多效果,这里只是做一个记录,具体还需要更多的实践经验。

集群模式允许联网的 Node.js 应用程序(http(s)/tcp/udp 服务器)在所有可用的 cpu 上扩展,无需任何代码修改。根据可用 cpu 的数量,这将极大地提高应用程序的性能和可靠性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/71319.html

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

相关文章

WiFi基础(六):天线基础知识

liwen01 2024.10.01 前言 麦克斯韦预言了电磁波的存在,赫兹通过实验证实了麦克斯韦的预言,马可尼基于无线电磁波的原理发明了无线电报系统,从此人类进入无线通信系统时代。 天线是通信系统中必不可少的组成部分,它的作用是将电信号转换为电磁波信号发射出去,也可以将接收到…

Veritas NetBackup 10.5 (Unix, Linux, Windows) - 领先的企业备份解决方案

Veritas NetBackup 10.5 (Unix, Linux, Windows) - 领先的企业备份解决方案Veritas NetBackup 10.5 (Unix, Linux, Windows) - 领先的企业备份解决方案 The #1 enterprise backup and recovery solution. 请访问原文链接:https://sysin.org/blog/veritas-netbackup-10/ 查看最…

致阿里云:我有一个小需求,请帮忙去掉AI助手

不同浪潮来临时,开始着不同的浪花,云计算浪潮开始时没人敢用,AI浪潮开始时人人试水。除了满天飞的大模型,除了千金难买的AI芯(GPU显卡),除了让开发者惊叹与恐惧的AI编程助手,还有阿里云官网那个强塞给用户的AI助手。当AI对算力的疯狂需求,当计算有可能成为AI时代的石油…

Windows 11 绕过 TPM 方法总结,24H2 通用免 TPM 镜像下载 (Updated Oct 2024)

Windows 11 绕过 TPM 方法总结,24H2 通用免 TPM 镜像下载 (Updated Oct 2024)Windows 11 绕过 TPM 方法总结,24H2 通用免 TPM 镜像下载 (Updated Oct 2024) 在虚拟机、Mac 电脑和 TPM 不符合要求的旧电脑上安装 Windows 11 的通用方法总结 请访问原文链接:https://sysin.org…

sicp每日一题[2.44]

我在这一章遇到了一个大问题,就是书上用的那些函数 beside, wave, flip-vert 我统统用不了。我用的是 DrRacket 这个软件,在网上查了半天,终于找到了解决办法。 首先是官方教程,在 DrRacket 中依次打开 File -> Package Manager...,在弹出的页面中 "Do What I Mea…

Day7 备战CCF-CSP练习

201409-4Day 7 题目描述 栋栋最近开了一家餐饮连锁店,提供外卖服务。 随着连锁店越来越多,怎么合理的给客户送餐成为了一个急需解决的问题。 栋栋的连锁店所在的区域可以看成是一个 \(nn\)的方格图(如下图所示),方格的格点上的位置上可能包含栋栋的分店(绿色标注)或者客…

Windows Server 2025 OVF, released Sep 2024 (sysin) - VMware 虚拟机模板

Windows Server 2025 OVF, released Sep 2024 (sysin) - VMware 虚拟机模板Windows Server 2025 OVF, released Sep 2024 (sysin) - VMware 虚拟机模板 2024 年 9 月版本更新,现在自动运行 sysprep,支持 ESXi Host Client 部署 请访问原文链接:https://sysin.org/blog/windo…