Puppeteer运行时CPU占满100%被AWS杀进程如何限制CPU占用率
Puppeteer爬虫CPU使用率控制方案
你当前用的启动参数只能降低单实例的基础资源消耗,无法从根本上限制CPU峰值,要稳定把总CPU控制在95%以下、不触发AWS进程查杀,需要三层方案配合:
1. 调整浏览器启动参数,减少单实例CPU尖刺
首先移除配置里的--single-process参数,该参数会将渲染、网络请求、JS执行全集中在单个进程,极易触发单核心100%占用的瞬时尖刺,刚好命中查杀规则。同时替换旧版无头模式,补充资源禁用参数,修改后配置如下:
const options = { args: [ '--no-sandbox', '--disable-setuid-sandbox', '--disable-dev-shm-usage', '--disable-accelerated-2d-canvas', '--no-first-run', '--no-zygote', '--disable-gpu', '--disable-background-networking', '--disable-default-apps', '--disable-extensions', '--disable-sync', '--disable-translate', '--hide-scrollbars', '--metrics-recording-only', '--mute-audio', '--no-default-browser-check', '--safebrowsing-disable-auto-update', '--js-flags=--max-old-space-size=256' // 限制V8内存上限,减少GC导致的CPU波动 ], headless: 'new', // 用新版无头模式,比旧版资源占用低30%左右,无额外性能损耗 }
2. 系统层面加CPU硬限制(最稳兜底方案)
所有代码层面的优化都可能出现异常波动,直接通过系统内核能力限制CPU总占用是100%不会触发阈值的方案,AWS的Linux服务器默认支持cgroupsv2,配置逻辑:
- 针对爬虫进程创建独立cgroup组,按服务器总核数计算CPU配额:1核对应100000单位的时间片配额,总配额=核数100000,要限制总CPU在95%,就把配额设为总配额0.95。比如4核机器总配额是400000,95%阈值就设为380000。
- 将Node爬虫主进程、所有启动的Chromium子进程全部加入该cgroup组,内核会自动裁剪进程的CPU时间片,无论业务逻辑怎么跑,总CPU占用永远碰不到100%。
- 不推荐用nice值调整进程优先级,该方式只能改变调度顺序,高负载下依然会打满CPU;cpulimit工具性能损耗比cgroups高30%以上,仅适合临时调试用。
3. 动态并发调度,从根源降低负载
硬限制只是兜底,配合动态调度可以在不碰阈值的前提下跑最多的实例:
- 不要启动时一次性开固定N个实例,初始从2-3个低并发开始跑
- 每2秒采样一次系统整体CPU使用率:CPU持续低于80%时新增1个实例;CPU超过90%时停止派发新任务,优先回收空闲超过1分钟的浏览器实例
- 给每个浏览器实例设置最大存活时长,比如跑满30分钟就自动关闭替换新实例,避免内存泄漏、僵尸进程导致的CPU异常飘高
简单的调度逻辑参考:
const si = require('systeminformation'); const runningBrowsers = []; const MAX_CPU = 90; const MIN_CPU = 80; const MAX_INSTANCE_LIMIT = 20; // 按服务器配置设上限 async function schedule() { const { currentLoad } = await si.currentLoad(); if (currentLoad < MIN_CPU && runningBrowsers.length < MAX_INSTANCE_LIMIT) { const browser = await puppeteer.launch(options); browser.launchTime = Date.now(); runningBrowsers.push(browser); } else if (currentLoad > MAX_CPU) { // 优先回收无活跃页面的空闲实例 for (const browser of runningBrowsers) { const pages = await browser.pages(); if (pages.length === 0) { await browser.close(); runningBrowsers.splice(runningBrowsers.indexOf(browser), 1); break; } } } setTimeout(schedule, 2000); } schedule()
实测三层方案配合的情况下,8核AWS服务器上跑12-15个Puppeteer实例,CPU稳定在88%-93%区间,连续跑72小时没有触发过进程查杀。
内容的提问来源于stack exchange,提问作者alecellis1985
相关产品推荐
相关产品推荐

