优化方案
(1)启用 Zend Opcache,启用 Opcache 非常简单, 在 PHP.ini 配置文件中加入:
zend_extension=opcache.so
opcache.enable=1
opcache.enable_cli=1
(2)使用 GCC4.8 以上的编译器来编译安装包,只有 GCC4.8 以上编译出的 PHP 才会开启 Global Register for opline and execute_data 支持。
(3)开启 HugePage 支持,首先在系统中开启 HugePages, 然后开启 Opcache 的 hugecodepages。
关于 HugePage
操作系统默认的内存是以 4KB 分页的,而虚拟地址和内存地址需要转换,而这个转换要查表,CPU 为了加速这个查表过程会内建 TLB(Translation Lookaside Buffer)。显然,如果虚拟页越小,表里的条目数也就越多,而 TLB 大小是有限的,条目数越多 TLB 的 Cache Miss 也就会越高,所以如果我们能启用大内存页就能间接降低这个 TLB Cache Miss。
开启方法
以 CentOS 6.5 为例, 通过命令:
sudo sysctl vm.nr_hugepages=128
分配 128 个预留的大页内存。
$ cat /proc/meminfo | grep Huge
AnonHugePages: 444416 kB
HugePages_Total: 128
HugePages_Free: 128
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
然后在 PHP.ini 中加入
opcache.huge_code_pages=1