Chrome Headless puppeteer占用CPU过高

28

我在使用Node.js和Puppeteer编写了一个爬虫算法,可以同时爬取5页网站。当程序完成一张页面的爬取后,它会从队列中获取下一个URL并在同一个页面中打开。然而,CPU 总是保持在 100%。有什么方法可以让Puppeteer使用更少的CPU资源呢?

这个程序运行在DigitalOcean的一台机器上,该机器拥有4GB RAM 和2个vCPU。

我已经尝试使用一些参数来启动 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();
});

2
这正是我现在遇到的同样问题,也是在DigitalOcean上。你找到解决方法了吗? - Alex MacArthur
3个回答

32
我的默认参数,请测试一下并告诉我是否运行顺利。 请注意,当访问易受攻击的网站时,--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)

1
确实帮了很多!谢谢! - drmrbrewer
7
好的,下面是翻译的内容:P.S. 可用选项及其含义列表,请参见:https://peter.sh/experiments/chromium-command-line-switches/ - drmrbrewer
2
感谢 @drmrbrewer 提供这份详尽的列表。 - Edi Imanto
1
谢谢,但是使用 --no-sandbox 不是很危险吗? - Alex Craft
1
正如所述,当您浏览易受攻击的网站时,“--no-sandbox”并不安全。如果您只是测试自己的网站,并且当然您肯定知道自己在做什么,那么您可以使用此参数。 - Edi Imanto
显示剩余2条评论

2

这可能涉及到几个因素。首先,请检查您访问的网站是否使用了大量 CPU。像画布和其他脚本之类的东西可以轻松地消耗你的 CPU,特别是在使用画布时。

如果您正在使用 docker 进行部署,请确保使用 dumb-init这里有一个不错的仓库,详细介绍了为什么要使用这样的东西,但基本上,分配给您的 docker 镜像中的进程 ID 在处理终止时会出现一些问题:

EXPOSE 8080

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

这是我在使用Docker处理部署时在browserless.io上目睹并修复的事情之一,其中包括CPU使用率。

我正在使用带有dumb init的Docker,但它仍然占用了所有4个核心的50%。没有使用画布,只打开了1个页面。 - Laurynas Mališauskas
@LaurynasMališauskas,你的Dockerfile是否公开可见? - browserless

0
为了避免并行执行导致高 CPU 使用率,我不得不使用 p-iteration NPM 包按顺序执行作业。在我的情况下,这不是问题,因为我的作业不需要太多时间。
您可以根据您的场景使用 forEachSeries 或 mapSeries 函数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接