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

Puppeteer-Cluster始终仅占用半数CPU核心问题求助

Puppeteer集群CPU利用率无法拉满的解决方案

问题场景

配置如下Puppeteer集群:

const cluster = await Cluster.launch({
    concurrency: Cluster.CONCURRENCY_PAGE, // maximize sharing data between jobs
    maxConcurrency: 8,
    monitor: true
})

在Mac OS Ventura(2019款8核i7)、Node.js v16.19.0环境下,仅4个核心CPU使用率飙升,调高maxConcurrency、调整并发模型、自定义Chrome参数均无法提升整体CPU利用率。

原因分析与解决方法

  • Node.js线程池限制:Node.js默认libuv线程池大小为4,会限制Chrome底层异步I/O操作的并发数,进而拖累CPU利用率。通过以下方式扩大线程池:

    # 终端启动时设置环境变量
    export UV_THREADPOOL_SIZE=8
    

    或在代码开头添加:

    process.env.UV_THREADPOOL_SIZE = 8;
    
  • Chrome进程资源限制:MacOS对进程组资源存在隐性限制,可通过Chrome启动参数调整:

    const cluster = await Cluster.launch({
        concurrency: Cluster.CONCURRENCY_PAGE,
        maxConcurrency: 8,
        monitor: true,
        puppeteerOptions: {
            args: [
                '--disable-features=site-per-process', // 降低进程隔离开销
                '--max-processes=8', // 允许更多Chrome子进程
                '--no-sandbox' // 非生产环境可添加,减少权限限制
            ]
        }
    })
    
  • 线程亲和性调整:MacOS可能存在线程绑定问题,用taskpolicy调整进程调度策略:

    # 启动脚本时强制利用多核心
    taskpolicy -b node your-script.js
    

    或针对运行中的Node进程:

    taskpolicy -b -p <Node进程PID>
    
  • 并发模型切换:Cluster.CONCURRENCY_PAGE模式下页面进程开销较高,尝试切换为上下文级并发:

    const cluster = await Cluster.launch({
        concurrency: Cluster.CONCURRENCY_CONTEXT,
        maxConcurrency: 8,
        monitor: true
    })
    

验证方式

调整后通过Activity Monitor观察Chrome子进程数量及CPU核心占用,同时用cluster.idle()确认任务队列执行效率。

内容的提问来源于stack exchange,提问作者Emmanuel Schanzer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 01:15:31