nginx服务器在运行内存密集型任务时无响应(Wkhtmltpdf,Imagick)

时间:2017-11-21 16:01:10

标签: php nginx memory wkhtmltopdf

我正在运行一个使用DigitalOcean为我的生产站点提供服务的虚拟机。

我的整个网站在创建一个大的100mb / 100page pdf时,或者在将几张图片编译成一个大图片时挂起。

该网站在

上运行
PHP 7.0.1 and nginx 1.6.0 in Ubuntu 14.04. 

当用户运行内存密集型任务时,整个站点将挂起,直到任务完成。

这种情况发生在使用Imagick和WkHtmlToPdf扩展创建和编译PDF的脚本中。

运行大约需要2分钟,在此任务运行时,没有其他用户可以访问该站点。

VM规格:

Ubuntu 14.04 x64 512 MB Memory / 20 GB Disk / AMS2

运行wkhtmltopdf / imagick时,VM监视器达到峰值

CPU 50%, memory 99%

似乎它可能是一个记忆问题。

如何阻止一个请求使整个网站无法响应?

我真的可以说小型服务器无法处理一个生成大型pdf的用户吗?

内存/ CPU密集型任务也不应该为其他用户的请求留出空间,或者我是否需要以某种方式手动启用并行化?也许512 MB还不够?

提前致谢!

1 个答案:

答案 0 :(得分:1)

基础Digital Ocean 512mb机器只有一个虚拟CPU - 它一次只能做一件事。如果它在单个内存密集型任务上花费了所有潜在的努力,那么通常在操作系统后台发生的所有其他事情都会排队,导致更多和更进一步的速度 - 所以你的工作可能只需要几秒钟本地多核笔记本电脑可能需要更长的时间。

此外,如果您在PHP Web请求中运行此任务,那么必须允许的另一层工作和内存。这可以帮助解释一些减速,特别是如果服务器必须将一些内存交换到磁盘以获得足够的工作空间。

如果这是一个常见的操作,那么将站点移动到具有更多内存和更多(虚拟)CPU的更强大的计算机将有助于允许其他内容同时运行。从长远来看,将流程移动到具有某种队列的另一个服务器,以便它可以在其他地方发生,它不会影响主Web服务器也可能非常有用,并且将是典型的潜在下一步。