You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 22:09:18