使用Huagepage和PGO来提升PHP7的执行性能

网络编程 2025-04-24 15:15www.168986.cn编程入门

这篇文章主要了如何使用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,进一步提升性能。就这么简单!为什么不用它来提升你的应用的性能呢?

Copyright © 2016-2025 www.168986.cn 狼蚁网络 版权所有 Power by