提高PHP for Arm64的性能以及对Amazon EC2 M6g实例的影响

2020-07-17 22:59:45

AWS最近发布了基于Graviton2的Amazon EC2M6g实例。与类似大小的M5实例相比,Graviton2实例在多个开源应用程序堆栈上的性价比提高了40%。

这篇博客讨论了AWS如何与PHP社区合作,推动在基于Graviton2的实例上对PHP软件堆栈的性能进行重大改进。通过使用M6g实例,目前最新版本的PHP-7.4与之前版本的PHP-7.3相比,执行时间最多提高了37%。这大大降低了在AmazonEC2M6g实例上运行PHP软件(如WordPress)的成本。

Zend优化器是PHP运行时系统的一个组件,可以在一系列Zend微基准上将性能提高高达30%。在PHP7.4之前,没有为ARM启用Zend优化器。AWS在PHP解释器的几个函数中添加了特定于ARM64的实现。AWS通过运行随Zend优化器分发的标准微基准测试来评估软件更改对PHP解释器的性能影响:Bench.php和Micro_Bench.php。要查看在满载服务器中使用的PHP解释器的性能,基准测试被设置为与系统中的vCPU并行运行多个副本,也就是说,每个vCPU运行基准测试的一个副本,从而使系统利用率超过95%。该实验在16个vCPU Graviton2 M6g.4xl和16个vCPU Intel M5.4xl实例上运行。在PHP版本7.3和7.4之间,M6g实例的执行时间提高了37%。下面的图像演示了基准测试结果:第一个图像显示了使用较新版本的PHP改进了Zend/Bench.php的执行时间,第二个图像显示了在Zend/Micro_Bench.php上使用较新版本的PHP可以更快地执行时间。

虽然合成基准测试证明了M6g的卓越性能,但我也关注了基于PHP的真实应用程序WordPress。下图显示了实验的设置:

图像中间表示的机器是被测系统(SUT),即M6g.4xl和M5.4xl。为了独立于系统中的其他组件测量PHP的性能,MySQL数据库设置为在单独的C5.4xl实例上运行,如图中蓝色所示。WRK程序为WordPress的主页生成HTTP请求。WRK在图中用橙色表示的单独C5.4xl实例上运行。为了最大限度地减少网络噪音,将这三台机器分配在同一集群放置组中。SUT运行Nginx Web服务器和PHP解释器。Nginx Web服务器配置有快速CGI接口PHP-FPM。所有机器都运行Ubuntu19.04。

通过PHP-7.4和PHP-8中的软件更改,WordPress在M6g.4xl上每秒可以比在M5.4xl上多服务17%的页面。再加上M6g实例成本降低20%,运行PHP-7.4和WordPress的M6g实例与M5实例相比,性价比最高可提高34%。下图显示了PHP版本7.3、7.4和8在M6g.4xl和M5.4xl实例上运行时的性能:

看看M6g实例上WordPress-Nginx基准测试的可伸缩性,以及性能更好的PHP-7.4版本,添加更多的vCPU几乎与服务页面的数量成线性关系,直到8个vCPU。但是,在2019年8月20日发布的包含更多优化的PHP-8测试版上,可扩展性趋势持续到32个vCPU(之后CPU利用率降至90%以下)。在低成本端,AWS提供了一个M6g.Medium实例,具有1vCPU,每秒可以支持高达77个页面,这可能会引起WordPress的小型(注重成本的)用户的兴趣。

与php-7.4和php-8主函数性能差异20%是由于https://github.com/php/php-src/commit/682b54f68748715f85e9ac4a267477d9ac61918a删除了对php-7.0php-7.0 https://wiki.php.net/rfc/remove_php4_constructors.中不推荐使用的php-4构造函数的支持。因为这是在PHP-7.4分支被砍掉之后的早期提交的,所以可以很容易地将补丁应用到PHP-7.4分支,以获得我们在PHP-8主分支中看到的性能优势。还有另外两个影响WordPress-Nginx基准测试性能的补丁,这两个补丁都已应用于master和PHP-7.4分支:

PHP-8计划在2021年发布,并对Arm64进行了更多改进:改进的Toupper/Tolower功能将性能提升16.5倍。Https://github.com/php/php-src/pull/4439。

AWS对PCRE2 10.34版进行了更改。在PHP-8中使用PCRE2版本10.34来匹配正则表达式。在WordPress基准测试中,PCRE2约占执行时间的8%。AWS对PCRE2所做的更改将第一个字符匹配和带霓虹灯指令的字符匹配对矢量化:在M6g上性能最多提高8倍。Https://lists.exim.org/lurker/message/20191106.052444.1ea1a176.en.html。

PHP-8计划采用一个新的JIT编译器来优化Opcache中的PHP字节码。JIT目前是在x86上开发的,并且基于Lua的JIT。由于Lua的JIT支持ARM64,我们与PHP开发人员合作,在PHP-8中启用和调优Opcache JIT,以在AWS Graviton处理器上获得最佳性能。

与PHP社区的互动是通过与PHP Zend优化器的维护人员进行早期讨论,讨论我们提高ARM性能的计划、提高提交质量的补丁审查,以及来自社区的后续补丁,以解决在审查补丁期间发现的问题。AWS继续为PHP-8提供ARM性能改进。我们遵循与PCRE社区相同的参与模式,并继续与其他开源社区合作,将我们的专业知识带到改进基于ARM的AWS Graviton系统的性能和调整方面。

PHP 7.4版是从基于Graviton2的M6g实例中获得最高性能的关键。与M5实例相比,PHP 7.4提供了更高的性能和更低的成本,从而使M6g实例更具吸引力。

要开始使用,请查看由AWS Graviton2提供支持的New-EC2 M6g实例,并请留言!