PHP7 性能优化笔记(应对服务器高并发)

此文章参考自:
zhuanlan.zhihu.com/p/138714082
www.cnblogs.com/jj0219/p/10476983....
www.laruence.com/2015/10/02/3069.h...

Opcache

1. Opcache原理
PHP的正常执行流程如下

Request请求(Nginx,Apache,Cli等)→ Zend引擎读取.php文件 → 扫描其词典和表达式 → 解析文件 → 创建要执行的计算机代码(称为Opcode) → 最后执行Opcode → Response 返回

每一次请求PHP脚本都会执行一遍以上步骤,如果PHP源代码没有变化,那么Opcode也不会变化,显然没有必要每次都重新生成Opcode,结合在Web中无所不在的缓存机制,我们可以把Opcode缓存下来,以后直接访问缓存的Opcode岂不是更快,启用Opcode缓存之后的流程图如下所示:

Opcode cache 的目地是避免重复编译,减少 CPU 和内存开销。
2. Opcache配置
在php.ini下添加:

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

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

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

$ cat /proc/meminfo  | grep Huge
AnonHugePages:    106496 kB
HugePages_Total:     512
HugePages_Free:      504
HugePages_Rsvd:       27
HugePages_Surp:        0
Hugepagesize:       2048 kB

然后在php.ini中加入:

opcache.huge_code_pages=1

Opcache file cache

1. Opcache file cache介绍
使用opcache把编译后的php文件存储为文件,实现php源码保护和脚本加速, 会有很明显的性能提升
2. 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%

聚合报告
PHP7性能优化笔记

每秒处理事务

PHP7性能优化笔记

优化后

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

第一次压测

聚合报告
PHP7性能优化笔记

每秒处理事务

PHP7性能优化笔记

第二次压测

聚合报告

PHP7性能优化笔记

每秒处理事务

PHP7性能优化笔记

本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由系统于 2年前 自动加精
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 20

好人一生平安

2年前 评论

Mark - Opcache

2年前 评论

很有帮助,谢谢

2年前 评论

很不错,感谢分享

2年前 评论
aa24615

支持

2年前 评论
opcache.huge_code_pages=1
opcache.file_cache=/tmp
加了这两个导致laravel-opcache扩展清除失败
2年前 评论
BanTang (楼主) 2年前
luyang (作者) 2年前

哇,我前两天刚看,好像是看到哪个大佬的面试记录上过

2年前 评论
BanTang (楼主) 2年前

十分钟 4万并发,总请求量是多少呢、我可以理解为40000 / 600(秒) = 66个qps嘛
我用laravel+swoole
wrk -t8 -c10000 -d30s –script=./wrk/list.lua –latency xxx.xxx.com/list
持续三十秒 大概总请求量 90万左右、qps 10000左右
三个两核两G容器、一个写入rds,一个读rds,压测cpu在40-60左右

2年前 评论
Luson

mark

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!