Chrome Headless puppeteer 占用太多 CPU

问题描述 投票:0回答:3

我在nodejs中有一个带有puppeteer的抓取算法,它可以同时抓取5个页面,当它完成一个页面时,它会从队列中提取下一个url并在同一页面中打开它。 CPU 始终处于 100%。如何让 puppeteer 使用更少的 cpu?

此进程在具有 4GB RAM 和 2 个 vCPU 的 digitaloceans Droplet 上运行。

我已经启动了带有一些参数的 puppeteer 实例,试图使其更轻,但什么也没发生

 puppeteer.launch({
    args: ['--no-sandbox', "--disable-accelerated-2d-canvas","--disable-gpu"],
    headless: true,
  });

我可以提供任何其他参数来减少 CPU 消耗吗?

我还阻止了图像加载

await page.setRequestInterception(true);
page.on('request', request => {
  if (request.resourceType().toUpperCase() === 'IMAGE')
    request.abort();
  else
    request.continue();
});
node.js google-chrome cpu-usage headless puppeteer
3个回答
35
投票

我的默认参数,请测试它并告诉我这是否运行顺利。 请注意,导航到易受攻击的网站时,

--no-sandbox
并不安全,但如果您正在测试自己的网站或应用程序,则没问题。所以请确保您知道自己在做什么。

  const options = {
    args: [
      '--no-sandbox',
      '--disable-setuid-sandbox',
      '--disable-dev-shm-usage',
      '--disable-accelerated-2d-canvas',
      '--no-first-run',
      '--no-zygote',
      '--single-process',
      '--disable-gpu'
    ],
    headless: true
  }

  return await puppeteer.launch(options)

2
投票

有几个因素可能会造成这种情况。首先,检查您正在访问的网站是否使用大量 CPU。像画布和其他脚本这样的东西很容易耗尽你的CPU,特别是在使用画布时。

如果您使用 docker 进行部署,请确保使用

dumb-init
这里有一个很好的存储库,其中介绍了为什么你会使用这样的东西,但本质上,在处理终止时,在 docker 映像中分配的进程 ID 会出现一些问题:

EXPOSE 8080

ENTRYPOINT ["dumb-init", "--"]
CMD ["yarn", "start"]

这是我在使用 docker 处理部署时亲眼目睹并在 browserless.io 上修复的问题,CPU 使用率就是其中之一。


0
投票

为了避免并行执行导致高 CPU 使用率,我必须使用

顺序执行作业

p-iteration NPM 包。就我而言,这不是问题,因为我的工作不需要太多时间。

您可以根据您的场景使用 forEachSeriesmapSeries 函数。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.