【问题标题】:Symfony2 application very slow in VirtualBoxVirtualBox中的Symfony2应用程序非常慢
【发布时间】:2012-02-11 12:51:44
【问题描述】:

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

性能很差。以下是本机 vbox 文件系统和带有 cifs 的 samba 挂载的 webgrind 输出:

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

这三个函数的输出不是都缓存在统计缓存中吗?为什么要花这么长时间?

如果能得到任何帮助,我将不胜感激!

编辑:澄清一下,生产性能很好。在我们的(适当的、非虚拟的)登台服务器上,PHP 代码在生产设置中的最大执行时间约为 60 毫秒,而在开发模式中则在 100-200 毫秒之间。

我需要帮助弄清楚为什么 VirtualBox 在开发和生产模式下要慢 100 倍。

我刚刚检查过,生产设置产生约 5 秒的执行时间。仍然无法使用,而且开发起来很尴尬。

【问题讨论】:

    标签: performance symfony virtualbox php


    【解决方案1】:

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

    我会做一个简短的简历。您不应仅根据app_dev.php 前端控制器来衡量应用程序的性能。此控制器已创建仅用于开发。在开发过程中,您对配置文件、树枝模板、资产等进行了大量更改。Symfony 将检查数百个文件的修改并在必要时重新加载许多以前缓存的内容,因此对filemtime、@987654325 的调用次数很高@ 和 is_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
    

    希望这会有所帮助。

    问候, 马特

    【讨论】:

    • 谢谢你,马特!您对 prod 和 dev 模式之间的区别是正确的,我提到的三个 PHP 函数从分析器中完全消失了。但是我仍然想知道为什么 VirtualBox 需要这么长时间来执行我的代码。我已经在上面的问题中澄清了这一点。干杯,菲利普
    • 我无法确定为什么 VirtualBox 这么慢。也许这个虚拟机在文件系统交互方面不是特别好。您可以尝试其他虚拟机来检查它们的性能。也许@PeteMitchell 的回答会有所帮助。在这一点上,我将把我的搜索工作集中在 VirtualBox 上。祝你的问题好运。问候,马特
    【解决方案2】:

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

    我不知道您的确切设置,但如果您安装正确的反向代理(又名 Varnish)而不是 AppCache 以尽可能少地向应用程序本身发出请求,您很可能会获得更好的结果。

    【讨论】:

    • 我会检查 C 扩展,谢谢 Anton。对于类似但物理的 Debian 安装在生产设置中的性能,我没有任何抱怨。我已经在上面扩展了我的问题,如果有歧义,抱歉。
    • 刚刚发现我的一位同事正在使用VirtualBox,他在为其分配更多内存之前遇到了类似的问题。试试看,如果可以的话。
    【解决方案3】:

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

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

    阅读这篇博文http://clock.co.uk/tech-blogs/virtualbox-404-shared-folder-update 了解更多信息

    【讨论】:

    • 谢谢你,Pete,我会调查的。
    【解决方案4】:

    只是为了解决这个问题:

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

    有点老套,但在开发模式下进行分析,执行时间从 5-13 秒降至 100-500 毫秒。

    【讨论】:

    • 考虑相同,因为我有完全相同的性能问题。尝试了 vboxsf 挂载,NFS ......它比直接文件读/写慢几倍。不幸的是,我通过我的 Eclipse 对存储库进行了大量搜索,同时搜索一些东西......而且它似乎速度较慢。
    【解决方案5】:

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

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

    Blogged about my solution in detail if you are interested

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-12
      • 2020-04-09
      • 2017-04-27
      • 1970-01-01
      • 2014-09-03
      • 2013-12-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多