opcache的参数解释

opcache.revalidate_freq
这个选项用于设置缓存的过期时间(单位是秒),当这个时间达到后,opcache会检查你的代码是否改变,如果改变了PHP会重新编译它,生成新的opcode,并且更新缓存。值为“0”表示每次请求都会检查你的PHP代码是否更新(这意味着会增加很多次stat系统调用,译注:stat系统调用是读取文件的状态,这里主要是获取最近修改时间,这个系统调用会发生磁盘I/O,所以必然会消耗一些CPU时间,当然系统调用本身也会消耗一些CPU时间)。可以在开发环境中把它设置为0,生产环境下不用管,因为下面会介绍另外一个设置选项。
opcache.validate_timestamps
当这个选项被启用(设置为1),PHP会在opcache.revalidate_freq设置的时间到达后检测文件的时间戳(timestamp)。
如果这个选项被禁用(设置为0),opcache.revalidate_freq会被忽略,PHP文件永远不会被检查。这意味着如果你修改了你的代码,然后你把它更新到服务器上,再在浏览器上请求更新的代码对应的功能,你会看不到更新的效果,你必须得重新加载你的PHP(使用kill -SIGUSR2强制重新加载)。
这个设定是不是有些蛋疼,但是我强烈建议你在生产环境中使用,why?因为当你在更新服务器代码的时候,如果代码较多,更新操作是有些延迟的,在这个延迟的过程中必然出现老代码和新代码混合的情况,这个时候对用户请求的处理必然存在不确定性。
opcache.max_accelerated_files
这个选项用于控制内存中最多可以缓存多少个PHP文件。这个选项必须得设置得足够大,大于你的项目中的所有PHP文件的总和。我的代码库大概有6000个PHP文件,所以我把这个值设置为一个素数7963。
真实的取值是在质数集合 { 223, 463, 983, 1979, 3907, 7963, 16229, 32531, 65407, 130987 } 中找到的第一个比设置值大的质数。 设置值取值范围最小值是 200,最大值在 PHP 5.5.6 之前是 100000,PHP 5.5.6 及之后是 1000000。
听起来好复杂,但用下面的命令就妥啦
你可以运行 find . -type f -print | grep php | wc -l 这个命令来快速计算你的代码库中的PHP文件数。
opcache.memory_consumption
这个选项的默认值为64MB,我把它设置为192MB,因为我的代码很大。你可以通过调用opcachegetstatus()来获取opcache使用的内存的总量,如果这个值很大,你可以把这个选项设置得更大一些。
opcache.interned_strings_buffer
这是一个很有用的选项,但是似乎完全没有文档说明。PHP使用了一种叫做字符串驻留(string interning)的技术来改善性能。例如,如果你在代码中使用了1000次字符串“foobar”,在PHP内部只会在第一使用这个字符串的时候分配一个不可变的内存区域来存储这个字符串,其他的999次使用都会直接指向这个内存区域。这个选项则会把这个特性提升一个层次——默认情况下这个不可变的内存区域只会存在于单个php-fpm的进程中,如果设置了这个选项,那么它将会在所有的php-fpm进程中共享。在比较大的应用中,这可以非常有效地节约内存,提高应用的性能。
这个选项的值是以兆字节(megabytes)作为单位,如果把它设置为16,则表示16MB,默认是4MB,这是一个比较低的值。
opcache.fast_shutdown
另外一个很有用但也没有文档说明的选项。从字面上理解就是“允许更快速关闭”。它的作用是在单个请求结束时提供一种更快速的机制来调用代码中的析构器,从而加快PHP的响应速度和PHP进程资源的回收速度,这样应用程序可以更快速地响应下一个请求。把它设置为1就可以使用这个机制了。

centos下操作和配置

1、配置HugePages:HugePages是Linux内核与2.6版本集成的一个特性。这个特性基本上提供了4K页面大小(IA64为16K)的替代方案,提供更大的页面。HugePages是一种拥有更大页面的方法,它对于处理非常大的内存非常有用。

编辑/etc/sysctl.conf文件,并在nr_hugepages参数中指定hugepages的数量。该条目使参数在重新引导时保持不变,但在运行下一步中描述的’ sysctl -p ‘命令之前不会生效。

  1. vi /etc/sysctl.conf
  2. vm.nr_hugepages = 10

执行’ sysctl -p ‘命令以启用hugepages参数。

  1. sysctl -p

要验证hugepages参数设置,可以对下面给出的两个方法使用任意一个:

  1. cat /proc/meminfo | grep Huge
  2. sysctl a | grep nr_hugepages

可采用以下方法计算。使用下面公式中“cat /proc/meminfo”的outpur值。

  1. HugePages_Total - HugePages_Free = HugePages_Used

正式开始配置PHP.ini

Request 请求(Nginx,Apache,Cli 等)→ Zend 引擎读取.php 文件 → 扫描其词典和表达式 → 解析文件 → 创建要执行的计算机代码 (称为 Opcode) → 最后执行 Opcode → Response 返回每一次请求 PHP 脚本都会执行一遍以上步骤,如果 PHP 源代码没有变化,那么 Opcode 也不会变化,显然没有必要每次都重新生成 Opcode,结合在 Web 中无所不在的缓存机制,我们可以把 Opcode 缓存下来,以后直接访问缓存的 Opcode 岂不是更快,启用 Opcode 缓存之后Opcode cache 的目地是避免重复编译,减少 CPU 和内存开销。
2. Opcache 配置
在 php.ini 下添加:

  1. // 加载opcache(需确认已安装opcache拓展)
  2. zend_extension=opcache.so
  3. // 开启opcache
  4. opcache.enable = 1
  5. // OPcache共享内存存储大小,单位MB
  6. opcache.memory_consumption=1024 // 1G
  7. // PHP使用了一种叫做字符串驻留,默认是4MB
  8. opcache.interned_strings_buffer=32
  9. // 这个选项用于控制内存中最多可以缓存多少个PHP文件,这个选项必须得设置得足够大,大于你的项目中的所有PHP文件的总和
  10. opcache.max_accelerated_files=80000
  11. // 设置缓存的过期时间(单位是秒),为0的话每次都要检查
  12. opcache.revalidate_freq=3
  13. // 从字面上理解就是“允许更快速关闭”
  14. opcache.fast_shutdown=1
  15. // CLI环境下,PHP启用OPcache
  16. opcache.enable_cli=1


HugePage

  1. HugePage 原理
    通过启用这个特性,PHP7 会把自身的 TEXT 段(执行体)” 挪 “到 Huagepage 上,之前的测试,我们能稳定的在 Wordpress 上看到 2%~3% 的 QPS 提升。
    关于 Hugepage 是啥,简单的说下就是默认的内存是以 4KB 分页的,而虚拟地址和内存地址是需要转换的, 而这个转换是要查表的,CPU 为了加速这个查表过程都会内建 TLB(Translation Lookaside Buffer), 显而易见如果虚拟页越小,表里的条目数也就越多,而 TLB 大小是有限的,条目数越多 TLB 的 Cache Miss 也就会越高, 所以如果我们能启用大内存页就能间接降低这个 TLB Cache Miss,至于详细的介绍,Google 一搜一大堆我就不赘述了,这里主要说明下如何启用这个新特性, 从而带来明显的性能提升。
  2. HugePage 配置

    1. $ sudo sysctl vm.nr_hugepages=512 // 切勿越大越好,会长占内存


    分配 512 个预留的大页内存:

    1. $ cat /proc/meminfo | grep Huge
    2. AnonHugePages: 106496 kB
    3. HugePages_Total: 512
    4. HugePages_Free: 504
    5. HugePages_Rsvd: 27
    6. HugePages_Surp: 0
    7. Hugepagesize: 2048 kB


    然后在 php.ini 中加入:

    1. opcache.huge_code_pages=1
    2. Opcache file cache
  3. Opcache file cache 介绍
    使用 opcache 把编译后的 php 文件存储为文件,实现 php 源码保护和脚本加速,会有很明显的性能提升

  4. Opcache file cache 配置
    在 php.ini 中加入:

opcache.file_cache=/tmp
这样 PHP 就会在 /tmp 目录下 Cache 一些 Opcode 的二进制导出文件,可以跨 PHP 生命周期存在.

配置后需重启 php-fpm
亲测
系统:centOs 7
php 版本:7.4
nginx
laravel: 8.5

优化前
cpu:95%-96%
内存:2G/16G
10 分钟 4W 并发
失败率:24%

聚合报告

每秒处理事务

优化后
cpu:20%-40%
内存:5.8G/16G(此处我 HugePage 设置 2048)
10 分钟 4W 并发
失败率:0%