APC 没有为 Symfony.4/Doctrine 应用程序带来任何性能提升?

Posted

技术标签:

【中文标题】APC 没有为 Symfony.4/Doctrine 应用程序带来任何性能提升?【英文标题】:APC not giving any performance gains for a Symfony1.4/Doctrine application? 【发布时间】:2012-05-16 14:04:18 【问题描述】:

我正在开发一个应用程序(Symfony 1.4 / Doctrine),它的一些页面加载起来非常繁重。其中一个页面包含一个非常复杂的表单,其中包含很多关系(嵌入式表单)。该页面执行以下操作:获取所有对象、创建表单(使用对象)、渲染表单。

这导致每页的加载时间约为 1.5 秒。 mysql 似乎不是瓶颈,执行查询大约需要 0.01 秒。然而,为结果补水需要更多时间:大约 0.3 秒。创建和嵌入所有子表单也需要很多时间(0.5s)。其余时间花在常规 Symfony/Doctrine 方法上。所有这些时间都是通过 Symfony 计时器和/或 xdebug 找到的。

我希望我可以通过使用 APC 进行操作码缓存来加快生产服务器上的进程。所以我安装了 APC,做了一些配置(缓存大小 = 400MB;最大文件大小 = 20MB,只是为了确定),最后对应用程序进行基准测试。

没有 APC:

$ ab -n 100
Requests per second:    0.72 [#/sec] (mean)
Time per request:       1392.142 [ms] (mean)
Time per request:       1392.142 [ms] (mean, across all concurrent requests)
Transfer rate:          130.62 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        4    5   3.6      4      32
Processing:  1301 1387 258.0   1338    3549
Waiting:     1229 1315 258.2   1267    3475
Total:       1305 1392 258.0   1342    3553

使用 APC:

$ ab -n 100
Requests per second:    0.86 [#/sec] (mean)
Time per request:       1160.666 [ms] (mean)
Time per request:       1160.666 [ms] (mean, across all concurrent requests)
Transfer rate:          156.67 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        4    4   0.7      4       9
Processing:  1071 1156 164.1   1121    2337
Waiting:     1024 1104 164.3   1065    2286
Total:       1075 1161 164.1   1125    2341

有一点改进,但​​结果相当令人失望。为了确保 APC 运行良好,我还对运行在同一台服务器上的 Drupal 网站进行了基准测试。这几乎使 Drupal 网站的请求数/秒翻了一番(从 4 页/秒到 8 页/秒)!很明显,APC 工作正常。

是否有人知道导致这种加速不足的原因可能是什么?有没有人在有/没有 APC 的 Symfony 应用程序上做过一些基准测试?我可以在应用程序的互联网上找到一些声明,它们的请求/秒数翻了一番,但都没有基准。

【问题讨论】:

您是否配置了学说查询缓存以使用 apc,如下所述:readthedocs.org/docs/doctrine/en/latest/en/manual/…? @chiborg:我很确定它确实如此(这是教义 1.2 文档,代码对我来说看起来很熟悉),是什么让你说它不是? 你能发布你的 apc.ini 吗? 【参考方案1】:

操作码缓存只会加速原始类的加载。很多时候代码循环遍历数据库结果,创建复杂对象时,仅靠 APC 将无济于事。

Doctrine 支持缓存查询和结果,但是需要配置 APC 中的缓存。见这个网址:http://readthedocs.org/docs/doctrine/en/latest/en/manual/caching.html

也许您可以在创建表单后使用apc_add 缓存表单。这有向用户呈现陈旧数据的风险,但也许值得。

要了解为什么需要这么长时间的更多信息,您应该查看profiling with XDebug。

【讨论】:

推荐使用查询/对象缓存(可以使用apc缓存驱动),你会得到我的支持 @greg0ire 我没有意识到 Doctrine 1 有一个缓存系统。惊人的!已删除我的评论并将您的链接添加到我的答案中。 +1,看看我的编辑,学说结果缓存可以按照你的建议做。 抱歉回复慢。看来您对 APC 仅适用于加载文件/类的事实是正确的。我在几乎什么都不做(但确实加载框架)的页面上做了一些基准测试,这里的请求/秒几乎翻了一番。 正如我在原始帖子中所解释的,我已经使用 XDebug 进行了一些分析。不幸的是,此应用程序无法提供旧表单/对象。

以上是关于APC 没有为 Symfony.4/Doctrine 应用程序带来任何性能提升?的主要内容,如果未能解决你的问题,请参考以下文章

php可选缓存APC

PHP 缓存插件之 Zend Opcache ( 取代 APC )

PHP之APC缓存详细介绍(学习整理)

APC 操作码缓存的工作原理

[]APC001

话说zendopcache与apc