在 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 脚本有计时器,如果需要超过一分钟,则重试加载页面,phantom.exit()
如果页面无法加载/PDF 生成失败,则最终调用。因此,即使出现问题,该过程仍应退出 - 但事实并非如此。
我尝试更改并行运行的 PhantomJS 实例的数量。尝试了 20 -> 10 -> 5 -> 3,但这似乎并不重要。当一次维护 20 个实例时,我实际上可以成功执行更多作业。
运行时,--debug=true
我可以看到它在某些时候卡在了
[DEBUG] WebPage - updateLoadingProgress:
也通过输出我看到了其中的几个警告:
[WARNING] QIODevice::write: device not open
这让我相信这是问题的根源。
我认为文件资源可能存在一些争用,所以我尝试不将输出重定向到日志文件,也不使用--local-storage-path
,但这没有帮助。
作为旁注,我已经使用 PhantomJS 几年了,现在只按顺序执行相同的过程(一次运行一个 PhantomJS 进程)。尽管有一些障碍需要克服,但效果很好。
知道是什么原因造成的吗?有人遇到过类似的问题吗?关于并行运行多个 PhantomJS 实例有什么建议吗?
谢谢!