Chrome Headless puppeteer CPU 过多

Posted

技术标签:

【中文标题】Chrome Headless puppeteer CPU 过多【英文标题】:Chrome Headless puppeteer too much CPU 【发布时间】:2018-08-07 01:27:29 【问题描述】:

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

此进程在具有 4gb RAM 和 2 个 vCPU 的 digitaloceans 液滴上运行。

我用一些 args 启动了 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();
);

【问题讨论】:

这是我现在遇到的同样问题,也在 DigitalOcean 上。你有没有发现什么技巧来照顾它? 【参考方案1】:

我的默认参数,请测试并告诉我这是否运行顺利。

  const options = 
    args: [
      '--no-sandbox',
      '--disable-setuid-sandbox',
      '--disable-dev-shm-usage',
      '--disable-accelerated-2d-canvas',
      '--no-first-run',
      '--no-zygote',
      '--single-process', // <- this one doesn't works in Windows
      '--disable-gpu'
    ],
    headless: true
  

  return await puppeteer.launch(options)

【讨论】:

似乎有很大帮助!谢谢! P.S.可用 args 及其含义的列表位于:peter.sh/experiments/chromium-command-line-switches 感谢@drmrbrewer 提供这个广泛的列表 谢谢,但是使用--no-sandbox会不会很危险? 还有其他人认为会有帮助的标志吗?【参考方案2】:

为了避免导致 CPU 使用率高的并行执行,我不得不使用顺序执行作业

p 迭代 NPM 包。就我而言,这不是问题,因为我的工作不会花费太多时间。

您可以根据具体情况使用 forEachSeriesma​​pSeries 函数。

【讨论】:

【参考方案3】:

有几个因素可以影响这一点。首先,检查您访问的站点是否使用大量 CPU。像画布和其他脚本这样的东西很容易消耗你的 CPU,尤其是在使用画布时。

如果您使用 docker 进行部署,请确保使用 dumb-init。 There's a nice repo here that goes into why you'd use such a thing,但本质上,在您的 docker 映像中分配的进程 ID 在处理终止时会出现一些问题:

EXPOSE 8080

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

这是我在 browserless.io 上看到并修复的,因为我使用 docker 来处理部署,CPU 使用率就是其中之一。

【讨论】:

我正在使用带有哑初始化的 docker,但它仍然占用了所有 4 个内核的 50%。没有使用画布,只打开了 1 个页面。 @LaurynasMališauskas 你的 dockerfile 有没有公开的?

以上是关于Chrome Headless puppeteer CPU 过多的主要内容,如果未能解决你的问题,请参考以下文章

Headless Chrome入门

chrome headless 无头浏览器 应用

前端测试框架 puppeteer 文档翻译

玩转Puppeteer

puppeteer + nodejs 抓取网页内容

无头Chrome驱动的分布式爬虫