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

nginx server unresponsive while running memory intensive tasks ( Wkhtmltpdf, Imagick)

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

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

站点 运行 位于

PHP 7.0.1 and nginx 1.6.0 in Ubuntu 14.04. 

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

这发生在创建和编译带有 Imagick 和 WkHtmlToPdf 扩展名的 PDF 的脚本中。

运行 大约需要 2 分钟,在此任务 运行ning 期间,其他用户无法访问该站点。

虚拟机规格:

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

虚拟机监控峰值,而 运行宁 wkhtmltopdf/imagick

CPU 50%, memory 99%

似乎是内存问题。

如何防止一个请求导致整个站点无响应?

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

此外,memory/cpu 密集任务不应该仍然为其他用户的请求留出空间,还是我需要以某种方式手动启用并行化?也许 512 MB 不够?

提前致谢!

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

此外,如果您从 PHP 网络请求中 运行 执行此任务,则必须考虑到另一层努力和记忆。这可能有助于解释一些减速,特别是如果服务器必须将一些内存换出到磁盘才能有足够的工作space。

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