使用Huagepage和PGO来提升PHP7的执行性能
这篇文章主要了如何使用Hugepage和PGO技术来提升PHP7的执行性能,这些技术是由著名的PHP开发组成员Laruence所研究并提出的。对于关注性能优化的朋友们,这些技术值得一试。
让我们来了解一下Hugepage技术。在PHP7的RC4版本中,有一个新的性能提升成果,即“HugePageFy PHP TEXT segment”。通过启用这个特性,PHP7会将自身的TEXT段(执行体)移至Hugepage上。在针对WordPress的测试中,我们能够实现稳定的2%~3%的QPS提升。
那么,Hugepage究竟是什么呢?默认情况下,内存是以4KB分页的。虚拟地址和内存地址需要转换,这个转换过程需要查表。CPU为了加速查表过程,会内建TLB(Translation Lookaside Buffer)。如果虚拟页越小,表中的条目数就越多,而TLB的大小是有限的,因此条目数越多,TLB的Cache Miss也会越高。如果我们能够启用大内存页,就可以间接降低TLB Cache Miss。
在的内核中,启用Hugepage已经变得非常简单。以我的开发虚拟机为例(Ubuntu Server 14.04,Kernel 3.13.0-45),我们可以通过查看内存信息来了解Hugepage的情况。然后,我们可以编译PHP RC4并配置opcache来提升性能。在编译PHP时,记得不要加–disable-huge-code-pages选项,因为这个新特性是默认启用的。
接下来,让我们来看看PGO技术。PGO是一种性能优化技术,可以根据程序的实际运行情况进行优化。在PHP7中,PGO也被广泛应用。通过收集程序的运行数据,PGO可以识别出哪些代码段最耗时间,然后对这些代码段进行优化。这使得PHP7在性能方面有了显著的提升。
为了充分利用PGO技术,我们需要进行编译时的优化。这包括选择合适的编译选项、调整编译参数等。我们还需要在应用程序中进行一些调整,以便更好地与PGO配合。例如,我们可以优化数据库查询、缓存策略等,以进一步提高应用程序的性能。
当我们在Opcache中启用新的特性时,我们需要对其进行特定的配置。通过设置`opcache.huge_code_pages=1`,我们可以启用这一功能。这一参数能够让Opcache在Hugepages上存储opcodes缓存,从而提升PHP-FPM的性能。
为了使用这个功能,我们首先要配置操作系统,分配一些Hugepages。通过运行命令`$ sudo sysctl vm.nr_hugepages=128`,我们分配了128个Hugepages。接着,我们可以通过查看内存信息来确认Hugepages是否已经就绪。
启动PHP-FPM后,我们可以看到内存信息中的Hugepages数量有所变化。这说明我们的PHP-FPM已经开始使用Hugepages了。为了验证`opcache.huge_code_pages`是否生效,我们可以关闭该功能并重新启动PHP-FPM,然后再次查看内存信息。我们会发现开启了该功能后,fpm启动后多用了几个pages。这时我们可以通过`$ size /home/huixinchen/local/php7/sbin/php-fpm`命令来检查php-fpm的text大小。从输出结果中我们可以看到text段的大小以及它所占用的pages数量,与我们之前推测的相符。
现在我们已经成功配置了opcache.huge_code_pages,并且验证了它的效果。这个过程虽然涉及到一些复杂的配置和命令,但是通过逐步操作,我们可以清晰地看到每一步的效果,最终实现了性能的提升。这个过程也让我们更加深入地了解了Opcache和Hugepages的工作原理,对PHP-FPM的性能优化有了更深入的认识。
通过以上的步骤和验证,我们已经成功配置了opcache.huge_code_pages,并且取得了预期的效果。这个过程不仅让我们了解了相关的技术知识,也让我们感受到了技术带来的乐趣和成就感。优化GCC编译的PHP7:利用PGO技术提升性能
启用某项特性后,可能会遇到一个问题是,如果你尝试使用Perf report/anno进行性能分析时,可能会发现符号丢失(Valgrind和GDB不受影响)。这主要是因为Perf的设计包括监听mmap并记录地址范围,然后进行IP到符号的转换。目前HugeTLB只支持MAP_ANON,导致Perf认为这部分地址没有符号信息。希望未来的Kernel版本能够解决这个限制。
PGO(Profile Guided Optimization)正如其名,是一种需要借助实际用例反馈来进行优化的技术。它需要一个特定的场景来生成反馈,因此并不是一个通用的优化方案。我们不能简单地包含这些优化,也无法直接发布PGO编译后的PHP7。
我们正在尝试从PGO找出一些共性的优化,然后手动应用到PHP7上,但这显然无法达到针对特定场景的特别优化的效果。我决定写这篇文章,简单介绍如何使用PGO来编译PHP7,让你的PHP7能针对你的独立应用进行特别优化,使其运行得更快。
决定向GCC提供哪些场景反馈时,我们通常选择的是:在你要优化的场景中,访问量最大、耗时最多、资源消耗最重的一个页面。以WordPress为例,我们选择的是WordPress的首页(因为首页往往是访问量最大的)。
以我的机器为例,配置为Intel(R) Xeon(R) CPU X5687 @ 3.60GHz X 16(超线程),48G Memory,php-fpm 采用固定32个worker,opcache采用默认配置(一定要记得加载opcache)。我们以WordPress 4.1为优化场景。
我们需要测试一下WordPress在PHP7下的性能。通过ab命令进行基准测试:
```bash
ab -n 10000 -c 100
```
测试结果中,我们可以看到WordPress 4.1在这个机器上,首页的QPS(每秒查询率)可以达到1116.48。
接下来,我们开始教GCC如何编译出更适合WordPress 4.1场景的PHP7。首先下载PHP7的源代码并进行常规配置。然后使用特殊的参数进行编译,生成包含性能分析数据的可执行文件:
```bash
make prof-gen
```
之后,通过运行PHP-CGI多次处理WordPress的首页来生成性能分析数据:
```bash
sapi/cgi/php-cgi -T 100 /home/huixinchen/local//htdocs/wordpress/index.php >/dev/null
```
接着进行第二次编译,利用刚才生成的性能分析数据来进行优化:
```bash
make prof-clean
make prof-use && make install
```
完成PGO编译后,我们再次测试PHP7的性能:
```bash
ab -n10000 -c 100
```
测试结果中,我们可以看到QPS提升到了1191.78,提升了大约7%。这个提升来自于我们自己的优化工作以及PGO技术的结合应用。实际上还有一些通用的优化已经被我们手动应用到PHP7中了。虽然我们没有完全利用PGO进行自动化优化,但已经取得了一些显著的成果。你可以使用自己的产品的经典场景来训练GCC,进一步提升性能。就这么简单!为什么不用它来提升你的应用的性能呢?
编程语言
- 使用Huagepage和PGO来提升PHP7的执行性能
- JS前端开发判断是否是手机端并跳转操作(小结)
- Javascript快速实现浏览器系统通知
- JavaScript数组操作函数汇总
- 详解ES6 系列之异步处理实战
- ASP.NET下对cookies的操作实现代码
- jQuery+css实现的切换图片功能代码
- jQuery 移动端拖拽(模块化开发,触摸事件,web
- JQuery 进入页面默认给已赋值的复选框打钩
- BootStrap智能表单实战系列(八)表单配置json详解
- JS实现的base64加密解密操作示例
- asp.net中3种验证码示例(实现代码)(数字,数字字母
- 详解vue中async-await的使用误区
- jquery+json实现动态商品内容展示的方法
- PHP receiveMail实现收邮件功能
- 五种提高 SQL 性能的方法