关于php:PHP-Opcache-配置优化实战

39次阅读

共计 3292 个字符,预计需要花费 9 分钟才能阅读完成。

前言

起源: 在很长的一段时间里, 咱们的 web 服务器在遇到大规模流量拜访的时候, 很容易就把 CPU 负载飙到了 100%, 导致响应速度过慢, 用户体验卡顿, 直到最近开启了 Opcahe 后, 咱们的 QPS 从 200-300+, 晋升了 1000+, 响应速度也进步了很多, 通过几天的摸爬滚打, 终于有了一些些小小的教训, 终于能够分享一下了。

在网上很多搜寻 Opcache 配置优化的一些博客, 很快就能取得一堆配置, 然而是否真的实用于当初的我的项目规模和资源模式呢?对此上面将阐明一些如何依据我的项目理论状况去优化 opcache 配置。

这是一段在网上举荐配置, 上面咱们尝试从理论登程来尝试调优这个配置。

opcache.enable=1
opcache.memory_consumption=512
opcache.interned_strings_buffer=64
opcache.max_accelerated_files=100000
opcache.validate_timestamps=1
opcache.revalidate_freq=60
opcache.save_comments=1
opcache.fast_shutdown=1

我的 PHP 试验环境为:PHP7.3, 不同版本可能略有差别。

配置调整 && 优化

opcache.enable

opcache.enable – 启用操作码缓存。如果禁用此选项,则不会优化和缓存代码。

所以咱们须要设置为开启状态, 能力启用到 Opcache。

opcache.enable = 1

opcache.memory_consumption

opcache.memory_consumption – OPcache 的共享内存大小,以兆 (M) 为单位。

它的默认值为 64M, 然而依据不同我的项目不同规模, 都有不同的设置, 咱们能够应用 opcache_get_status 函数来查看 Opcahce 耗费了多少内存, 是否依据须要减少内存,

opcache_get_status 中提供内存耗费信息的是memory_usage, 值以字节为单位(byte)

"memory_usage": {
    "used_memory": 91647160,
    "free_memory": 440537232,
    "wasted_memory": 4686520,
    "current_wasted_percentage": 0.8729323744773865
},

咱们计算 memory_consumption 的公式为: (used_memory + free_memory + wasted_memory) / 1048576

那么这个配置的后果为: (91647160 + 440537232 + 4686520) / 1048576 = 512M

memory_consumption = 512M

interned_strings_buffer

interned_strings_buffer – 用来存储预留字符串的内存大小,以兆字节为单位。

PHP 应用了一种叫做字符串驻留(string interning)的技术来改善性能。例如,如果你在代码中应用了 1000 次字符串“aabbcccdd”, 在 PHP 外部只会在第一次调配一个内存区域来贮存该字符串,剩下的 999 次将应用内存指针来援用该字符串。

默认状况中, 这个优化只会存在于单个 PHP-FPM 过程中, 如果设置了这个选项, 将会在所有 PHP-FPM 过程中共享。在比拟大的我的项目中,这能够十分无效地节约内存,进步利用的性能。

该选项默认值为 8MB, 咱们能够依据我的项目的规模和理论状况来调整这个数值。

opcache.interned_strings_buffer=8

opcache.interned_strings_buffer=16

opcache.max_accelerated_files

opcache.max_accelerated_files – OPcache 哈希表中可存储的脚本文件数量下限。实在的取值是在质数汇合 {223, 463, 983, 1979, 3907, 7963, 16229, 32531, 65407, 130987} 中找到的第一个大于等于设置值的质数。设置值取值范畴最小值是 200,最大值在 PHP 5.5.6 之前是 100000,PHP 5.5.6 及之后是 1000000。

配置要保留在内存中的文件数, 咱们能够通过以下命令在获取整个我的项目中的 php 文件数。

find . -type f -print | grep php | wc -l

能够依据我的项目的文件数, 在下面的 质数汇合中选取 >= 的第一个质数。

我本地我的项目的运行后果为:

find . -type f -print | grep php | wc -l

18918

那么配置则为:

opcache.max_accelerated_files = 32531

opcache.validate_timestamps

opcache.validate_timestamps 启用此选项后,PHP 将依据您的 opcache.revalidate_freq 值查看文件工夫戳, 来确定是否须要从新生成 PHP 脚本编译缓存。

在生产环境模式中, 如果我的项目流量比拟高, 申请比拟密集, 倡议敞开此选项, 以此来取得最高性能。

opcache.validate_timestamps = 0

设置敞开后, 每次部署代码无奈即时取得更新, 须要重启 php-fpm 过程或者应用 kill -SIGUSR2 进行平滑重启, 方可失效最新代码。

revalidate_freq

revalidate_freq – 查看脚本工夫戳是否有更新的周期,以秒为单位。设置为 0 会导致针对每个申请,OPcache 都会查看脚本更新。如果 opcache.validate_timestamps 配置指令设置为禁用,那么此设置项将会被疏忽。

在本地或开发环境开启 Opcache 咱们能够设置为:

opcache.revalidate_freq = 0

小型流量服务端, 能够设置为 600s(10 分钟), 查看脚本更新

opcache.revalidate_freq = 600

大型及中型服务端倡议设置 3600s 或 不做脚本更新查看, 或者定时在流量低峰期做查看。

opcache.revalidate_freq = 3600

save_comments

save_comments – 如果禁用,脚本文件中的正文内容将不会被蕴含到操作码缓存文件,这样能够无效减小优化后的文件体积。禁用此配置指令可能会导致一些依赖正文或注解的 利用或框架无奈失常工作,比方:Doctrine,Zend Framework 2 以及 PHPUnit。

如果我的项目中没有用到依赖注解等, 能够将这个选项敞开, 否者应开启。

fast_shutdown

fast_shutdown – 如果启用,则会应用疾速进行续发事件。所谓疾速进行续发事件是指依赖 Zend 引擎的内存治理模块 一次开释全副申请变量的内存,而不是顺次开释每一个已调配的内存块。

从 PHP 7.2.0 开始,此配置指令被移除。疾速进行的续发事件的解决曾经集成到 PHP 中,只有有可能,PHP 会主动解决这些续发事件。

这个字配置会放慢 php-fpm worker 过程回收, 以便为下一个申请更快做好筹备。

低于 PHP 7.2.0 须要手动开启。

opcache.fast_shutdown=1

最终咱们优化调整后的地位如下, 将它笼罩到 php.ini, 重载 php-fpm 过程即可失效。

opcache.enable=1
opcache.memory_consumption=512
opcache.interned_strings_buffer=64
opcache.max_accelerated_files=32531
opcache.validate_timestamps=0
opcache.save_comments=1
opcache.fast_shutdown=1

结尾

以上就是 opcache 局部配置优化策略, 正当的应用 OPcahce 将会缩小 Web 服务器的 CPU 使用率, 然而会减少肯定的内存使用率。如果应用失去, 这将会大大提高或服务端和 PHP 的吞吐量。

最初补上开启 OPcahe 的优化后的效果图。

正文完
 0