APC -> APCu / OPCache,性能差

31

我有一个 m3.xlarge 的 EC2 实例,今天我将其更新为 PHP 5.5.11

在这次更新中,php55-pecl-apc 被替换成了 php55-pecl-apcu

在阅读和尝试之后,我的理解是,除了可以通过 APCu 恢复的键值存储之外,APC 已被 OPCache 取代。

调整了配置后,我现在使用 Wordpress 登录时变得非常缓慢,至少比以前慢了 300-900ms(前端通过 Varnish 缓存,并且运行良好......但当你使用管理员时,它会故意不缓存并且非常慢)。

随着升级逐步进行,我进行了一系列基准测试,每个步骤都有一个小样本大小。随着时间推移,性能逐渐恶化。

  • APC(升级之前) -->
  • OPCache + 无 APCu -->
  • OPCache + APCu + WP 插件用于 APCu

现在我只使用 OPCache,没有 APCu。

  1. 我如何实现相同的性能?我喜欢管理员界面,我喜欢它有多快。我真的不认为这是任何改进,这真的很沮丧...除非有一些超级库我不知道。但肯定不是我拥有的,或者可能没有配置好。
  2. 假设问题1的答案是“你的配置很糟糕”,那么您介意看一下这个并确定是否合理吗?

对于我的设置,我正在使用最新的 Wordpress,一些重要的大型插件,但我无法将它们卸载。幸运的是,Varnish 可以处理大部分工作。我有4个核心,16GB内存,在我的网站根目录中有约10k个文件。除了 WordPress 之外,我没有任何真正强大的应用程序或其他东西,它是一个相当基本的设置。我想这就是可能有帮助的所有内容。

配置:

zend_extension=opcache.so
opcache.enable=1
opcache.enable_cli=0
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.max_wasted_percentage=5
opcache.use_cwd=1
opcache.validate_timestamps=1
opcache.revalidate_freq=0
opcache.revalidate_path=0
opcache.save_comments=0
opcache.load_comments=0
opcache.fast_shutdown=1
opcache.enable_file_override=0
opcache.optimization_level=0xffffffff
opcache.inherited_hack=1
opcache.dups_fix=0
opcache.blacklist_filename=/etc/php-5.5.d/opcache*.blacklist
opcache.max_file_size=2M
opcache.consistency_checks=1
opcache.force_restart_timeout=180
opcache.error_log=/var/log/php-fpm/5.5/opcache.log
opcache.log_verbosity_level=1
opcache.preferred_memory_model=
opcache.protect_memory=0

你确定OPCache已经被加载并且处于活动状态吗?创建一个名为testopcache.php的文件,里面包含<?php var_dump(opcache_get_status()); ?>,然后尝试访问它,它应该会告诉你OPCache是否正常工作。同时,尝试将opcache.max_file_size增加到5M或更大。 - user2629998
我将其增加到10M。它肯定在运行,我看到了一个巨大的转储。 - Tallboy
你能备份当前的安装文件并尝试删除这些“大型插件”来查看是否有所改变吗? - user2629998
@Tallboy 我需要看看打包APCu的人如何配置它,为我找到src rpm/pkg/whatever中的configure行... - Joe Watkins
3个回答

19

当前情况下,您正在每个请求中检查每个文件的更改情况,这可能不适用于生产系统。

我通常只是禁用它(记得在更改后重新启动Web服务器):

opcache.validate_timestamps=0

或者,您可以尝试将频率设置为0以外的某个值并保持启用状态:

opcache.validate_timestamps=1  
opcache.revalidate_freq=300

理论上,这应该只每5分钟检查一次更改。


9
您还有以下内容:
opcache.consistency_checks=1

根据文档所说,这会降低性能。请关闭它。

opcache.consistency_checks integer

如果非零,OPcache会在每N个请求后验证缓存校验和,其中N是此配置指令的值。这只应在调试时启用,因为它会影响性能。


5

以下是关于将OPCache集成到PHP的RFC:

APC可以回收旧的已失效脚本的内存。APC使用内存管理器,可以回收与不再使用的脚本相关联的内存;而Optimizer+的工作方式有所不同,它标记这样的内存为“脏”,但从未真正回收。一旦脏百分比超过可配置阈值,Optimizer+就会重新启动自身。请注意,此行为既有稳定性优势,也有劣势。

我猜测您是因为触发了操作码缓存重启的阈值。

参考链接:https://wiki.php.net/rfc/optimizerplus#advantages_of_apc_over_optimizer


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接