PHP Opcache 替换策略

Tim*_*niu 3 php opcache

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

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

最好我想缓存将具有最高命中率的文件。所以很高兴知道 Opcache 使用的替换策略是什么(如果有的话)。如何解决缓存中没有最常用文件的问题。FIFO、LRU 中的任何一个都适用于我的系统,但我还没有找到任何关于此的文档。

任何帮助,将不胜感激!

Jen*_*och 5

更换策略

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

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

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

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

但是,如果达到最大值,我可能不希望缓存中有很多文件。

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

重要说明:您不能使用opcache-invalidate()函数触发缓存删除。这只会标记一个已经缓存的文件以进行重新编译并重新添加到缓存中(重新编译/刷新)。从缓存中完全删除文件需要重置或重新启动;这总是会导致尖峰。


OpCache自述包含以下提醒:

速度调整

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

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
Run Code Online (Sandbox Code Playgroud)

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

opcache.save_comments=0 
opcache.enable_file_override=1
Run Code Online (Sandbox Code Playgroud)

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


性能调优策略

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

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

缓存预热

当缓存为空时,运行一个脚本,该脚本通过“热路径”(应用程序的常用路径)。这确保了底层文件从一开始就具有缓存覆盖。

图形用户界面工具

要查看统计信息、缓存的文件和使用的内存,您还可以使用 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指令。详情见/sf/answers/1490411121/
  • opcache.interned_strings_buffer- 优化器使用称为字符串实习的技术来提高性能。这基本上意味着,如果您的应用程序使用字符串“Hello World” 100 次,则该字符串将仅存储 1 次,这将节省 99 次字符串存储并导致对现有值的 99 次访问。4MB是默认的。尝试 8、12、16。
  • opcache.validate_timestamps=0 意味着额外的 stat 调用被删除。
  • opcache.save_comments- 您的应用程序是否在评论中使用了 docblock 注释?如果没有,请关闭。这样可以节省内存。
  • opcache.load_comments- 评论是否在缓存中取决于 opcache.save_comments。该指令的意思是“不加载缓存的注释”。似乎东西被缓存了,从未使用过。我必须管理我没有得到这个指令的用例。换句话说:我opache.save_comments用来控制评论的添加。
  • opcache.fast_shutdown- 这是一种更快地调用析构函数的技术。打开。

  • 这是一个很好的答案。谢谢! (2认同)