0

0

使用Node.js的Cluster模块充分利用多核CPU

betcha

betcha

发布时间:2025-11-02 20:49:07

|

359人浏览过

|

来源于php中文网

原创

Node.js通过Cluster模块实现多进程,利用多核CPU提升并发性能。主进程管理worker,各worker共享端口并由系统负载均衡。主进程监控worker状态,崩溃后自动重启,保障服务稳定。默认轮询分发连接,支持IPC通信,便于日志收集与状态监控。建议worker数匹配CPU核心,结合PM2等工具优化部署,应用应无状态或使用外部存储共享数据,避免内存浪费与数据不一致。

使用node.js的cluster模块充分利用多核cpu

Node.js 是单线程的,这意味着一个 Node.js 实例只能利用一个 CPU 核心。在多核服务器上,这会造成资源浪费。为了解决这个问题,Node.js 提供了 Cluster 模块,允许你创建多个工作进程(worker processes),每个进程运行在独立的 CPU 核心上,从而提升应用的并发处理能力。

Cluster 模块的基本原理

Cluster 模块基于 child_process 模块实现,它允许主进程(master)创建多个子进程(workers)。这些 worker 进程共享同一个网络端口,能够同时监听和处理 HTTP 请求。操作系统层面会自动将连接分发给不同的 worker,实现负载均衡。

主进程不处理具体业务逻辑,只负责管理 worker 进程:启动、监控、重启失败的进程等。如果某个 worker 崩溃,主进程可以重新启动一个新的,提高系统的稳定性。

如何使用 Cluster 创建多进程服务

下面是一个使用 Cluster 模块启动多个 worker 的简单示例:

const cluster = require('cluster'); const http = require('http'); const os = require('os'); const numCPUs = os.cpus().length; if (cluster.isMaster) { console.log(`主进程 ${process.pid} 正在运行`); // 创建与 CPU 核心数相同的工作进程 for (let i = 0; i { console.log(`工作进程 ${worker.process.pid} 已退出`); console.log('正在重启新的工作进程...'); cluster.fork(); }); } else { // worker 进程:创建 HTTP 服务器 http.createServer((req, res) => { res.writeHead(200); res.end('Hello from worker ' + process.pid); }).listen(3000); console.log(`工作进程 ${process.pid} 已启动`); }

在这个例子中:

  • 主进程通过 cluster.isMaster 判断自身角色,并启动多个 worker。
  • 每个 worker 调用 cluster.fork() 创建,它们都监听 3000 端口。
  • 主进程监听 'exit' 事件,在 worker 崩溃后自动重启,保证服务可用性。

负载均衡与连接分发

Cluster 模块默认使用轮询方式(round-robin)分发连接,也可以设置为操作系统默认策略。对于大多数 Web 服务来说,默认配置已经足够高效。

如果你希望强制使用轮询调度,可以在 fork 前设置:

有道翻译AI助手
有道翻译AI助手

有道翻译提供即时免费的中文、英语、日语、韩语、法语、德语、俄语、西班牙语、葡萄牙语、越南语、印尼语、意大利语、荷兰语、泰语全文翻译、网页翻译、文档翻译、PDF翻

下载
cluster.schedulingPolicy = cluster.SCHED_RR;

注意:在 Windows 平台或某些系统上,调度策略可能不会生效,系统会自动降级处理。

进程间通信(IPC)

主进程和 worker 之间可以通过内置的 IPC 通道通信。例如,worker 可以向主进程发送日志、状态信息或异常报告。

在 worker 中发送消息:

process.send({ type: 'log', data: 'Worker 正在处理请求' });

在主进程中监听:

cluster.on('message', (worker, message) => { console.log(`来自 worker ${worker.id}:`, message); });

这种机制适合用于集中式日志收集、健康检查或动态配置更新。

实际部署建议

  • 通常建议创建与 CPU 核心数相等的 worker 数量,避免过多进程造成上下文切换开销。
  • 结合 PM2 等进程管理工具使用更方便。PM2 内置 cluster 模式,支持零停机重启、日志管理等功能。
  • 确保你的应用是无状态的,或使用外部存储(如 Redis)共享 session,避免 worker 之间的数据不一致问题。
  • 注意内存使用,每个 worker 都是独立的 Node.js 实例,会占用独立内存空间。

基本上就这些。使用 Cluster 模块能有效提升 Node.js 应用的性能和容错能力,尤其适用于高并发的 Web 服务场景。合理配置下,可以充分发挥现代多核服务器的硬件优势。

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

738

2023.08.22

require的用法
require的用法

require的用法有引入模块、导入类或方法、执行特定任务。想了解更多require的相关内容,可以阅读本专题下面的文章。

465

2023.11.27

session失效的原因
session失效的原因

session失效的原因有会话超时、会话数量限制、会话完整性检查、服务器重启、浏览器或设备问题等等。详细介绍:1、会话超时:服务器为Session设置了一个默认的超时时间,当用户在一段时间内没有与服务器交互时,Session将自动失效;2、会话数量限制:服务器为每个用户的Session数量设置了一个限制,当用户创建的Session数量超过这个限制时,最新的会覆盖最早的等等。

308

2023.10.17

session失效解决方法
session失效解决方法

session失效通常是由于 session 的生存时间过期或者服务器关闭导致的。其解决办法:1、延长session的生存时间;2、使用持久化存储;3、使用cookie;4、异步更新session;5、使用会话管理中间件。

739

2023.10.18

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

88

2025.08.19

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

523

2023.09.20

length函数用法
length函数用法

length函数用于返回指定字符串的字符数或字节数。可以用于计算字符串的长度,以便在查询和处理字符串数据时进行操作和判断。 需要注意的是length函数计算的是字符串的字符数,而不是字节数。对于多字节字符集,一个字符可能由多个字节组成。因此,length函数在计算字符串长度时会将多字节字符作为一个字符来计算。更多关于length函数的用法,大家可以阅读本专题下面的文章。

918

2023.09.19

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

480

2023.08.10

C++ 单元测试与代码质量保障
C++ 单元测试与代码质量保障

本专题系统讲解 C++ 在单元测试与代码质量保障方面的实战方法,包括测试驱动开发理念、Google Test/Google Mock 的使用、测试用例设计、边界条件验证、持续集成中的自动化测试流程,以及常见代码质量问题的发现与修复。通过工程化示例,帮助开发者建立 可测试、可维护、高质量的 C++ 项目体系。

5

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
进程与SOCKET
进程与SOCKET

共6课时 | 0.3万人学习

Redis+MySQL数据库面试教程
Redis+MySQL数据库面试教程

共72课时 | 6.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号