【发布时间】:2015-09-25 01:55:05
【问题描述】:
我在 Ubuntu 14 上运行多个 PhantomJS 实例时遇到问题。几分钟后,进程变得无响应。
背景简介: 使用 PhantomJS 2.0 呈现最终使用 Wkhtmtopdf 保存为 PDF 的网页。 PhantomJS 只负责加载页面、发出 ajax 请求以及等待 PDF 保存到服务器后的响应。它不会生成 PDF 本身。 有数百个网页需要生成为 PDF,所以我想在系统允许的范围内并行运行尽可能多的 PhantomJS 实例。
每个 PhantomJS 进程都由一个 shell 脚本启动,如下所示:
{path to phantomjs} {path to js file} --data {some argument} >> {path to log file} 2>&1 &
问题发生在几分钟后,我停止从 PhantomJS 进程获取任何输出,查看top 我可以看到他们只是躺在那里没有做任何事情。 JS 脚本有计时器,如果页面超过一分钟,会重试加载,如果页面无法加载/PDF 生成失败,最终会调用phantom.exit()。因此,即使出现问题,该进程仍应退出 - 但它不会。
我尝试更改并行运行的 PhantomJS 实例的数量。尝试了 20 -> 10 -> 5 -> 3,但这似乎并不重要。一次维护 20 个实例时,我实际上可以成功执行更多作业。
当使用--debug=true 运行时,我可以看到它有时会卡在
[DEBUG] WebPage - updateLoadingProgress:
还通过输出,我看到了其中的几个警告:
[WARNING] QIODevice::write: device not open
这让我相信这是问题的根源。
我认为文件资源可能存在争用,所以我尝试不将输出重定向到日志文件,也没有使用--local-storage-path,但这没有帮助。
作为旁注,我已经使用 PhantomJS 几年了,现在只执行相同的过程,只是顺序(一次运行一个 PhantomJS 进程)。虽然有一些障碍需要克服,但效果很好。
知道是什么原因造成的吗? 有人遇到过类似的问题吗? 关于并行运行多个 PhantomJS 实例有什么建议吗?
谢谢!
【问题讨论】:
-
我遇到了完全相同的问题!您是否设法找到解决方案?谢谢!
-
@YuviDroid,我还没有找到可靠的解决方案。我能够通过限制在任何给定时间运行的实例数量以及在重试作业而不是使用同一页面时关闭/创建新页面对象来避免该问题。那是不久前的事了,所以我不记得究竟是什么让它“稳定”了,但是,它需要大量的试验和错误。而且我希望能够运行比我目前正在运行的更多的实例,因此我们将不胜感激。
-
您使用的是什么版本的 PhantomJS?它可能与此图像渲染错误有关,该错误应该已从 2.1.1 修复 -> code.google.com/p/phantomjs/issues/detail?id=54
-
您是否考虑过实际上是 Web 服务器导致问题的可能性?许多服务器限制并发连接(甚至进行基于 ip 的限制),如果 phantomjs 超过了服务器自己的“任意请求数”限制,那么它将不得不等待(即“挂起”),直到服务器释放更多数据。跨度>
-
放弃phantomJS并使用电子或噩梦github.com/segmentio/nightmareelectron.atom.io
标签: javascript phantomjs scalability freeze contention