PHP Opcache替换策略

时间:2016-07-11 23:34:25

标签: php opcache

我知道APC正在被OpCache取代。我启用了这个模块,到目前为止一切正常。但是,关于如何调整它以获得最佳性能的文档很少。

我的系统目前有大量需要缓存的文件。因此,如果这些文件使其缓存,那么一切都很棒。但是,如果达到最大值,我在缓存中可能不需要很多文件。

最好我想要缓存命中率最高的文件。因此,如果有的话,知道Opcache使用的替换策略会很好。如何解决缓存中没有最常用文件的问题。 FIFO,LRU中的任何一个都适用于我的系统,但我还没有找到任何相关的文档。

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:4)

替换策略

不要期待FIFO或LRU。那东西并不像那样工作。操作码缓存在首次访问PHP文件时存储代码,在内部优化代码并根据时间间隔和文件修改标记和使用的内存来决定是否更新缓存中的文件。

所以关键问题:要缓存多少个文件?存储多少内存?内部代码优化的内容是什么?如何排除文件?什么时候刷新文件?如果你想深入理解OpCache,你可以在这里找到Julien Pauli的精彩文章:http://jpauli.github.io/2015/03/05/opcache.html

  

如何解决缓存中没有最常用文件的问题。

我会增加内存和最大文件设置,直到这些文件被缓存。

  

但是,如果达到最大值,我在缓存中可能不需要很多文件。

  • opcache.blacklist_filename救援。您可以使用黑名单文件来描述不应加速的文件。

重要说明:使用opcache-invalidate()功能无法触发缓存删除。这只会标记一个已经缓存的文件,用于重新编译和重新添加到缓存(重新编译/刷新)。从缓存中完全删除文件需要重置或重启;这总是会引起飙升。

OpCache Readme包含以下建议:

  

速度调整

     

我们建议使用以下配置选项以获得最佳性能   在生产环境中。

opcache.memory_consumption=128 
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
opcache.enable_cli=1
     

您还可以添加以下内容,但它可能会破坏某些应用程序   构架。请阅读这些指令的说明并添加它们   你自己承担风险。

opcache.save_comments=0 
opcache.enable_file_override=1
     

关于如何调整此内容以获得最佳性能的文档很少

效果调整策略

找到最佳设置是基于很多事情。您可以使用A / B或A / B / C测试策略来查找配置指令的良好值。

您的出发点是激活的OpCache,默认设置为运行性能测试A.然后您将调整或调整一些OpCache指令以更改缓存行为并运行性能测试B.最后,您可以比较结果并绘制一个结论,如果对指令的更改产生了您想要的结果并提高了性能。

缓存预热

当缓存为空时,运行一个脚本,该脚本遍历"热路径" (应用程序的常用路径)。这可以确保,底层文件从一开始就具有缓存覆盖率。

GUI工具

要查看统计信息,缓存的文件和使用的内存,您还可以使用其中一个OpCache"检查员"。这为您提供了概述,使您也可以从缓存中查找要排除的文件。

一些与效果相关的指令

http://php.net/manual/de/opcache.configuration.php

  • opcache.memory_consumption。默认值为64MB。你可以提高它。
  • opcache.max_accelerated_files - 最大缓存文件数。要查找文件数:find . -type f -print | grep php | wc -l
  • 重要的是opcache.optimization_level指令。有关详细信息,请参阅https://stackoverflow.com/a/21291587/1163786
  • opcache.interned_strings_buffer - 优化器使用一种称为字符串实习的技术来提高性能。这基本上意味着,如果您的应用程序使用字符串" Hello World" 100次,字符串只存储1次,这样可以节省99个字符串存储,并导致99次访问已存在的值。 4MB是默认值。尝试8,12,16。
  • opcache.validate_timestamps=0表示删除了额外的统计信息。
  • opcache.save_comments - 您的应用是否在评论中使用docblock注释?如果没有,请关闭。这样可以节省内存。
  • opcache.load_comments - 评论要么在缓存中,要么取决于opcache.save_comments。该指令意味着"不加载缓存的注释"。似乎东西被缓存,从未使用过。我必须管理员,我没有得到该指令的用例。换句话说:我使用opache.save_comments来控制注释的添加。
  • opcache.fast_shutdown - 这是一种更快地调用解构器的技术。打开。