Node.js集群模式下类实例生成及CPU占用问题咨询
我来帮你逐一拆解这些问题,结合Node.js集群模式和PM2的实际运行机制来解答:
PM2集群模式下的类实例与超时循环
PM2的集群模式本质是fork出多个独立的Node.js工作进程,每个进程都拥有自己独立的内存空间和运行环境。所以如果你的类是在进程启动阶段初始化的(比如在入口文件里new YourClass()),那每个worker进程都会生成一个完全独立的类实例——这些实例之间没有任何内存共享,各自运行自己的代码逻辑。
同理,如果你在类里启动了超时循环(比如setInterval或者递归的setTimeout),每个worker进程也会单独运行自己的循环,互不干扰。
Puppeteer在集群模式下的特殊情况
Puppeteer的情况要格外注意:每个worker进程都会启动自己独立的Chrome/Chromium浏览器实例(包括对应的页面、渲染引擎等)。这意味着如果你开了N个worker,就会同时运行N个浏览器实例,每个实例都会独立执行网页抓取、数据解析和数据库更新的操作。
这里的资源消耗是关键——浏览器本身就是CPU和内存大户,尤其是处理带复杂JavaScript渲染的页面时,单个浏览器实例就能占用不少CPU。
AWS t2.medium实例的CPU占用风险
t2.medium实例是2核CPU配置,PM2默认会创建与CPU核心数相等的worker进程(也就是2个)。如果每个worker都跑一个Puppeteer实例,在抓取任务密集时,CPU占用很容易飙升:
- 两个浏览器同时渲染页面,大概率会快速消耗掉t2实例的CPU积分
- 积分耗尽后,实例会被强制降频,CPU性能大幅下降,不仅当前抓取任务会卡,当天后续的所有工作都会受影响
给你的几点建议(不用全面测试也能降低风险)
- 先从小规模试起:不要直接开2个worker,先设置
pm2 start app.js -i 1(只开1个worker),观察CPU使用情况,确认稳定后再考虑是否增加 - 优化Puppeteer资源占用:启动浏览器时添加
--no-sandbox(注意安全风险,若抓取的是可信网站可以用)、--disable-dev-shm-usage、--single-process等参数,减少内存和CPU消耗;同时限制每个实例的并发页面数,避免同时加载过多页面 - 复用浏览器实例:在单个worker进程里,不要每次抓取都新建浏览器,而是复用一个浏览器实例下的多个页面,减少重复初始化的开销
- 替换轻量方案:如果目标网站不需要JavaScript渲染,直接用
axios、node-fetch等HTTP请求库,资源消耗会比Puppeteer低很多
内容的提问来源于stack exchange,提问作者Rachelle Janssen
相关产品推荐
相关产品推荐

