日请求亿级的 QQ 会员 AMS 平台 PHP 7 升级实践

QQ 会员活动运营平台( AMS ),是 QQ 会员增值运营业务的重要载体之一,承担海量活动运营的 Web 系统。 AMS 是一个主要采用PHP语言实现的活动运营平台, CGI 日请求3亿左右,高峰期达到8亿。然而,在之前比较长的一段时间里,我们都采用了比较老旧的基础软件版本,就是 PHP5.2+Apache2.0(2008年的技术)。尤其从去年开始,随着 AMS 业务随着 QQ 会员增值业务的快速增长,性能压力日益变大。

于是,自2015年5月,我们就开始规划 PHP 底层升级,最终的目标是升级到 PHP 7。那时, PHP 7尚处于研发阶段,而我们讨论和预研就已经开始了。

一.PHP 7的学习和预研

1. HHVM 和 JIT

2015年就 PHP 性能优化的方案,有另外一个比较重要的角色,就是由 Facebook 开源的 HHVM(HipHop Virtual Machine ,HHVM 是一个 Facebook 开源的 PHP 虚拟机)。HHVM 使用 JIT(Just In Time,即时编译是种软件优化技术,指在运行时才会去编译字节码为机器码)的编译方式以及其他技术,让 PHP 代码的执行性能大幅提升。据传,可以将 PHP5 版本的原生 PHP 代码提升5-10倍的执行性能。

HHVM 起源于 Facebook 公司,Facebook 早起的很多代码是使用 PHP 来开发的,但是,随着业务的快速发展, PHP 执行效率成为越来越明显的问题。为了优化执行效率,Facebook 在2008年就开始使用 HipHop,这是一种PHP执行引擎,最初是为了将 Fackbook 的大量 PHP 代码转成 C++,以提高性能和节约资源。使用 HipHop 的PHP 代码在性能上有数倍的提升。后来,Facebook 将 HipHop 平台开源,逐渐发展为现在的 HHVM。

HHVM 成为一个 PHP 性能优化解决方案时,PHP7还处于研发阶段。曾经看过部分同学对于 HHVM 的交流,性能可以获得可观的提升,但是服务运维和 PHP 语法兼容有一定成本。有一阵子,JIT 成为一个呼声很高的东西,很多技术同学建议 PHP 7也应该通过 JIT 来优化性能。

2015年7月,我参加了中国 PHPCON,听了惠新宸关于 PHP7 内核的技术分享。实际上,在2013年的时候,惠新宸( PHP7内核开发者)和 Dmitry (另一位PHP语言内核开发者之一)就曾经在 PHP5.5的版本上做过一个 JIT 的尝试(并没有发布)。PHP 5.5的原来的执行流程,是将 PHP 代码通过词法和语法分析,编译成 opcode 字节码(格式和汇编有点像),然后,Zend 引擎读取这些 opcode 指令,逐条解析执行。

日请求亿级的 QQ 会员 AMS 平台 PHP 7 升级实践

日请求亿级的 QQ 会员 AMS 平台 PHP 7 升级实践

而他们在opcode环节后引入了类型推断(TypeInf),然后通过JIT生成ByteCodes,然后再执行。

日请求亿级的 QQ 会员 AMS 平台 PHP 7 升级实践

日请求亿级的 QQ 会员 AMS 平台 PHP 7 升级实践

于是,在 benchmark (测试程序)中得到非常好的结果,实现JIT后性能比 PHP 5.5提升了8倍。然而,当他们把这个优化放入到实际的项目 WordPress (一个开源博客项目)中,却几乎看不见性能的提升。原因在于测试项目的代码量比较少,通过 JIT 产生的机器码也不大,而真实的 WordPress 项目生成的机器码太大,引起 CPU 缓存命中率下降(CPU Cache Miss)。

总而言之,JIT 并非在每个场景下都是点石成金的利器,而脱离业务场景的性能测试结果,并不一定具有代表性。

从官方放出Wordpress的 PHP 7和 HHVM 的性能对比可以看出,两者基本处于同一水平。

日请求亿级的 QQ 会员 AMS 平台 PHP 7 升级实践

日请求亿级的 QQ 会员 AMS 平台 PHP 7 升级实践

2. PHP7在性能方面的优化

PHP 7是一个比较底层升级,比起 PHP 5.6的变化比较大,而就性能优化层面,大致可以汇总如下:

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。