我正在使用selenium运行chrome headless,命令如下:
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 &"
然而,看起来chrome headless消耗了太多的内存和cpu,有人知道我们如何限制chrome headless的CPU/内存使用吗?或者是否有一些变通办法。
先谢了。
2条答案
按热度按时间gkl3eglg1#
关于Chrome Headless会话不可预测的 * CPU * 和 * 内存消耗 *,已经有很多讨论。
根据讨论构建headless以最小化cpu + mem使用率,可以通过以下方式优化CPU+内存使用率:
requestAnimationFrame
和animation triggers
),但我们预计这里会节省大量CPU。上面已经提到了几点,下面是在生产环境中运行headless浏览器时需要采用的一些常见最佳实践:
不管怎么说,如果可能的话,不要运行无头浏览器。无头浏览器是不可预测的,而且很饥渴。几乎所有你能用浏览器做的事情(除了插入和运行JavaScript)都可以用简单的Linux工具完成。有一些库提供优雅的Node API,用于通过HTTP请求和刮取获取数据,如果这是你的最终目标的话。
有些用户试图保持浏览器打开,即使在不使用的时候,这样它总是可以用于连接。虽然这可能是一个很好的策略,以帮助加快会话启动,但它只会在几个小时后结束痛苦。这主要是因为浏览器喜欢缓存的东西,慢慢地消耗更多的内存。任何时候你不积极使用浏览器,关闭它!
我们应该只在绝对必要的时候运行一个会话,下一个最佳实践是在每个浏览器上只运行一个会话。虽然通过并行处理页面可以节省一些开销,但如果一个页面崩溃,它可能会导致整个浏览器崩溃。另外,每个页面并不能保证是完全干净的(cookie和存储可能会泄漏)。
page.waitForNavigation
**:最常见的问题之一是触发页面加载的操作,以及脚本执行的突然丢失。这是因为触发
pageload
的操作通常会导致后续工作被吞噬。为了解决这个问题,通常必须调用page-loading-action并立即等待下一个页面加载。Chrome需要很多依赖项才能正常运行。即使所有这些都完成了,你还是要担心字体和幻像进程之类的问题,所以使用某种容器来包含它是理想的。Docker几乎是为这项任务定制的,因为你可以限制可用资源的数量并用沙箱保护它。自己创建自己的Docker文件。
为了避免运行僵尸进程(这在Chrome中很常见),您需要使用类似**
dumb-init
**的命令来正确启动。可以有两个 * JavaScript运行时 * 在运行(Node和浏览器),这对于可共享性来说是很好的,但它的代价是混乱,因为一些页面方法将要求您显式地传入引用(而不是使用闭包或提升)。
举个例子,当在协议的底层使用
page.evaluate
时,这实际上是stringifies
函数,并将其传递到Chrome,所以闭包和提升之类的操作根本不起作用。如果你需要将一些引用或值传递到evaluate调用中,只需将它们作为参数附加,这样就可以得到正确的处理。参考:Observations running 2 million headless sessions
k97glaaz2#
考虑使用Docker。它有很好的文档功能来限制系统资源的使用,比如内存和CPU。好消息是,它很容易建立一个内部有无头Chrome(在X11之上)的Docker映像。
这方面有很多现成的解决方案,请查看:https://hub.docker.com/r/justinribeiro/chrome-headless/