Symfony2应用程序在VirtualBox中非常慢

时间:2012-01-16 15:45:22

标签: performance symfony virtualbox php

我在VirtualBox上运行Debian的虚拟副本,在nginx / php5-fpm / MySQL堆栈上开发一个更大的PHP应用程序。开发在主机操作系统(Windows 7 x64)中进行,代码作为共享文件夹安装在客户操作系统中。

表现非常糟糕。以下是本机vbox文件系统的webgrind输出和带有cifs的samba安装:

vboxfs profiling smbfs profiling

在任何一种情况下,filemtimefile_existsis_readable都需要几秒钟才能运行。 CPU负载非常高,内存使用情况似乎正常。

这三个函数的输出是不是缓存在stat缓存中?他们为什么要这么久?

我真的很感激我能得到任何帮助!

编辑:为了澄清,生产表现很好。在我们的(适当的,非虚拟的)登台服务器上,PHP代码在生产设置中最多执行约60ms,在开发模式下执行时间在100-200ms之间。

我需要帮助弄清楚为什么VirtualBox在开发和安装方面要慢100倍刺激模式。

我刚检查过,生产设置产生〜5秒执行。仍然无法使用,加上用它开发很尴尬。

5 个答案:

答案 0 :(得分:5)

我最近回答了一个类似的问题。您可以找到我之前的回答here

我会做一个小简历。您不应仅基于app_dev.php前端控制器来衡量应用程序的性能。此控制器已创建仅用于开发。在开发中,您对配置文件,树枝模板,资产等进行了大量更改.Symfony将检查数百个文件以进行修改,并在必要时重新加载许多以前缓存的内容,因此调用filemtime的次数很多, file_existsis_readable。所有这些调用都在生产模式下被绕过,因为Symfony期望缓存中的所有内容都是最新的。因此,几乎所有可能的东西都在生产模式下缓存并在没有Symfony检查文件是否被修改的情况下直接使用。这提供了巨大的性能提升,因为在开发中重新加载单个文件可能需要花费很多时间来解析它,检查它的依赖性,根据这些文件重新计算所有文件等等。

如果您对应用程序进行基准测试,请将其作为生产模式进行基准测试。至少,如果您无法按照预期的那样进行生产中的所有硬件设置,请执行以下步骤。清除生产模式的缓存并使用app.php代替app_dev.php。另外,请查看文档中可在symfony.com上找到的performance部分。控制台在此处调用清除和预热生产环境中的缓存。我认为cache:clear也会预热缓存,但由于我不是100%肯定,我更喜欢同时进行两次调用:

php app/console cache:clear --env=prod --no-debug
php app/console cache:warmup --env=prod --no-debug

希望这有帮助。

此致 马特

答案 1 :(得分:5)

使用nfs文件共享。 Samba和vbox文件共享可能非常慢。

您的分析表明文件系统操作是瓶颈。

阅读此博文http://clock.co.uk/tech-blogs/virtualbox-404-shared-folder-update以获取更多信息

答案 2 :(得分:4)

只是为了解决这个问题:

最后,我在来宾操作系统上设置了一个samba共享,将其绑定到第二个网络适配器(host-only, like in this guide)并将其作为主机操作系统中的网络驱动器安装。

有点hacky,但是在开发模式下执行时间从5-13秒下降到100-500ms并进行性能分析。

答案 3 :(得分:1)

除了Matt之外我建议你编译twig扩展并将其用作php模块。它会更快地生成模板。但最重要的是在prod环境中运行你的应用程序的任何基准测试,但不是在开发或测试中。确保你没有在生产中加载xdebug模块,因为它也会降低你的基准测试速度。

我不知道您的确切设置,但如果您安装正确的反向代理(又名Varnish)而不是AppCache,则最有可能获得更好的结果,以尽可能减少对应用本身的请求。< / p>

答案 4 :(得分:1)

有同样的问题,通过设置一个rsync cron来修复它,该代码使VM和主机上的代码保持同步。

显然,Virtualbox共享文件夹在文件读/写方面非常慢:/

Blogged about my solution in detail if you are interested