为了账号安全,请及时绑定邮箱和手机立即绑定

限制Chrome无头CPU和内存使用量

/ 猿问

限制Chrome无头CPU和内存使用量

慕姐8265434 2019-12-06 09:34:34

我正在使用硒通过以下命令无头运行chrome:


system "LC_ALL=C google-chrome --headless --enable-logging --hide-scrollbars --remote-debugging-port=#{debug_port} --remote-debugging-address=0.0.0.0 --disable-gpu --no-sandbox --ignore-certificate-errors &"

但是,似乎无头铬正在消耗过多的内存和cpu,有人知道我们如何限制无头铬的CPU /内存使用率?或者,如果有一些解决方法。


提前致谢。


查看完整描述

2 回答

?
慕仰0522570

曾有很多讨论到处对不可预知的CPU内存消耗浏览器无头会话。

根据讨论,构建最低的cpu + mem使用率,可以通过以下方式优化CPU +内存使用率:

  • 使用自定义代理或C ++ ProtocolHandlers,您可以返回存根1x1像素图像,甚至完全阻止它们。

  • Chromium小组正在努力增加何时制作框架的程序控制。目前,无头Chrome仍在尝试以60 fps进行渲染,这非常浪费。许多网页都需要几帧(也许10-20 FPS)正确渲染(由于使用requestAnimationFrameanimation triggers),但我们预计有大量的CPU节省在这里了。

  • MemoryInfra应该帮助您确定哪个组件是设置中最大的内存使用者。

  • 用法可以是:

    $ headless_shell --remote-debugging-port=9222 --trace-startup=*,disabled-by-default-memory-infra http://www.chromium.org
  • 铬将始终使用尽可能多的资源。如果要有效限制其利用率,则应考虑使用cgroups


话虽如此,这里是在生产环境中运行无头浏览器时需要适应的一些常见最佳实践:

资源使用

图:Headless Chrome的资源浪费情况

  • 不要运行无头浏览器

    从所有方面来看,即使有可能,也不要运行无头的浏览器。无头浏览器是不可预测的且饥饿的。使用浏览器几乎可以完成的所有工作(用于插值和运行JavaScript的工作)都可以通过简单的Linux工具完成。有一些库提供了优雅的Node API,用于通过HTTP请求获取数据并进行抓取(如果那是您的最终目标)。

  • 不需要时不要运行无头浏览器

    有些用户试图使浏览器保持打开状态,即使在不使用时也是如此,以便始终可用于连接。尽管这可能是帮助加快会话启动的好策略,但它只会在几个小时后陷入困境。这在很大程度上是因为浏览器喜欢缓存内容并缓慢占用更多内存。每当您不积极使用浏览器时,请将其关闭!

  • 与浏览器(而非页面)并行

    我们仅应在绝对必要时运行一个会话,下一个最佳实践是通过每个浏览器仅运行一个会话。虽然实际上可以通过并行处理页面来节省一些开销,但是如果一个页面崩溃,它可能会导致整个浏览器崩溃。那样,再加上每个页面都不能保证完全干净(cookie和存储可能会泄漏)。

  • page.waitForNavigation

    观察到的最常见问题之一是触发页面加载的操作以及脚本执行的突然丢失。这是因为触发a的动作pageload通常会导致后续工作被吞噬。为了解决此问题,通常必须调用page-loading-action,并立即等待下一次页面加载。

  • 使用docker包含所有内容

    Chrome需要大量依赖才能正常运行。即使所有这些都完成了,您仍然需要担心诸如字体和幻影处理之类的事情,因此使用某种容器来容纳它是理想的。Docker几乎是为此任务定制的,因为您可以限制可用资源的数量并将其沙箱化。自己创建自己的Dockerfile

    为了避免遇到僵尸进程(通常在Chrome中发生),您需要使用类似的方法dumb-init来正确启动。

  • 两种不同的运行时

    可能有两个JavaScript运行时(Node和浏览器)。这对于共享性而言非常有用,但是却以混淆为代价,因为某些页面方法将要求您显式传递引用(而不是使用闭包或提升)。

    举例来说,在page.evaluate深层使用 协议的内部时,此stringifies函数实际上是将函数传递给Chrome的,因此诸如闭包和提升之类的操作根本不起作用。如果您需要将一些引用或值传递到评估调用中,则只需将它们附加为经过适当处理的参数即可。


查看完整回答
反对 回复 2019-12-06
?
慕盖茨4494581

考虑使用Docker。它具有详细记录的功能,可用于限制系统资源(如内存和cpu)的使用。好消息是,构建带有无头Chrome(在X11之上)的Docker映像非常容易。


有很多现成的解决方案,请查看:https : //hub.docker.com/r/justinribeiro/chrome-headless/


查看完整回答
反对 回复 2019-12-06

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信