2022-06-10 08:16:47
Node.js可通过cluster模块创建多工作进程,每个进程绑定独立CPU核心,共享同一端口处理请求,从而充分利用多核CPU性能。 以下是具体实现方法与关键要点:
一、核心机制:主进程与工作进程架构通过cluster.isPrimary判断是否为主进程,负责监听端口、衍生工作进程(cluster.fork())、监控进程状态(如exit事件)。
不直接处理请求,仅作为调度中心,崩溃后需手动重启(或配合PM2等工具自动恢复)。
每个进程独立运行在CPU核心上,通过http.createServer()共享同一端口(如3000),操作系统自动分配连接。
进程间内存隔离,崩溃不影响其他进程,主进程可捕获exit事件并重启。
关键点:
工作进程→主进程:使用process.send(message)发送消息。
主进程→工作进程:通过cluster.on('message', (worker, message) => {})监听。示例:工作进程上报CPU使用率,主进程汇总后广播配置更新。
在工作进程内捕获未处理的异常(如process.on('uncaughtException')),避免进程意外退出。
主进程监听exit事件时记录日志,便于排查问题。
通常设置为CPU核心数(os.cpus().length),过多会导致上下文切换开销增大。
I/O密集型应用可适当增加,但需通过压测验证性能。
使用PM2的cluster_mode简化部署,支持日志聚合、性能监控、自动重启等功能。PM2启动命令示例:
pm2 start app.js -i max # 'max'表示自动匹配CPU核心数每个工作进程独立占用内存,总内存消耗≈单进程内存×核心数。
监控内存使用(如process.memoryUsage()),避免内存泄漏导致进程崩溃。
结合PM2的reload命令实现平滑重启,避免服务中断。示例:
pm2 reload app # 逐个重启工作进程I/O密集型应用(如Web服务器、API服务),可显著提升吞吐量。
需要高可用性的长运行服务(通过自动重启机制保障稳定性)。
CPU密集型任务:因Node.js事件循环机制,仍可能成为瓶颈,建议用C++扩展或拆分任务。
状态共享:进程间内存隔离,需借助外部存储(如Redis)共享会话或缓存数据。
通过合理使用cluster模块,Node.js应用可高效利用多核CPU资源,同时保持代码简洁性与可维护性。结合监控工具与错误处理机制,能进一步提升生产环境稳定性。