让你的PHP7更快之Hugepage用法分析


Posted in PHP onMay 31, 2016

本文实例讲述了让你的PHP7更快之Hugepage用法。分享给大家供大家参考,具体如下:

PHP7刚刚发布了RC4, 包含一些bug修复和一个我们最新的性能提升成果(NEWS), 那就是”HugePageFy PHP TEXT segment”, 通过启用这个特性,PHP7会把自身的TEXT段(执行体)”挪“到Huagepage上,之前的测试,我们能稳定的在Wordpress上看到2%~3%的QPS提升。

关于Hugepage是啥,简单的说下就是默认的内存是以4KB分页的,而虚拟地址和内存地址是需要转换的, 而这个转换是要查表的,CPU为了加速这个查表过程都会内建TLB(Translation Lookaside Buffer), 显而易见如果虚拟页越小,表里的条目数也就越多,而TLB大小是有限的,条目数越多TLB的Cache Miss也就会越高, 所以如果我们能启用大内存页就能间接降低这个TLB Cache Miss,至于详细的介绍,Google一搜一大堆我就不赘述了,这里主要说明下如何启用这个新特性, 从而带来明显的性能提升。

新的Kernel启用Hugepage已经变得非常容易了,以我的开发虚拟机为例(Ubuntu Server 14.04,Kernel 3.13.0-45), 如果我们查看内存信息:

$ cat /proc/meminfo | grep Huge
AnonHugePages:  444416 kB
HugePages_Total:    0
HugePages_Free:    0
HugePages_Rsvd:    0
HugePages_Surp:    0
Hugepagesize:    2048 kB

可见一个Hugepage的size是2MB, 而当前并没有启用HugePages. 现在让我们先编译PHP RC4, 记得一定不要加: ?disable-huge-code-pages (这个新特性是默认启用的, 你加了这个就关了)

然后配置opcache, 从PHP5.5开始Opcache已经是默认启用编译的,但是是编译动态库的, 所以我们还是要在php.ini中配置加载下。

zend_extension=opcache.so

这个新特性是做在Opcache里的,所以也要通过Opcache启用这个特性(通过设置opcache.huge_code_pages=1), 具体的配置:

opcache.huge_code_pages=1

现在让我们配置OS, 分配一些Hugepages:

$ sudo sysctl vm.nr_hugepages=128
vm.nr_hugepages = 128

现在让我们再次检查内存信息:

$ cat /proc/meminfo | grep Huge
AnonHugePages:  444416 kB
HugePages_Total:   128
HugePages_Free:   128
HugePages_Rsvd:    0
HugePages_Surp:    0
Hugepagesize:    2048 kB

可以看到我们分配的128个Hugepages已经就绪了, 然后我们来启动php-fpm:

$ /home/huixinchen/local/php7/sbin/php-fpm
[01-Oct-2015 09:33:27] NOTICE: [pool www] 'user' directive is ignored when FPM is not running as root
[01-Oct-2015 09:33:27] NOTICE: [pool www] 'group' directive is ignored when FPM is not running as root

现在, 再次检查内存信息:

$ cat /proc/meminfo | grep Huge
AnonHugePages:  411648 kB
HugePages_Total:   128
HugePages_Free:   113
HugePages_Rsvd:    27
HugePages_Surp:    0
Hugepagesize:    2048 kB

说到这里,如果Hugepages可用, 其实Opcache也会用Hugepages来存储opcodes缓存, 所以为了验证opcache.huge_code_pages确实生效, 我们不妨关闭opcache.huge_code_pages, 然后再启动一次后看内存信息:

$ cat /proc/meminfo | grep Huge
AnonHugePages:  436224 kB
HugePages_Total:   128
HugePages_Free:   117
HugePages_Rsvd:    27
HugePages_Surp:    0
Hugepagesize:    2048 kB

可见开启了huge_code_pages以后, fpm启动后多用了4个pages, 现在我们检查下php-fpm的text大小:

$ size /home/huixinchen/local/php7/sbin/php-fpm
  text    data     bss     dec     hex   filename
10114565   695200   131528   10941293   a6f36d   /home/huixinchen/local/php7/sbin/php-fpm

可见text段有10114565个字节大小, 总共需要占用4.8个左右的2M的pages, 考虑到对齐以后(尾部不足2M Page部分不挪动), 申请4个pages, 正好和我们看到的相符。

说明配置成功! Enjoy !

但是有言在先, 启用此特性以后, 会造成一个问题就是你如果尝试通过Perf report/anno 去profiling的时候, 会发现符号丢失(valgrind, gdb不受影响), 这个主要原因是Perf的设计采用监听了mmap,然后记录地址范围, 做IP到符号的转换, 但是目前HugeTLB只支持MAP_ANON, 所以导致Perf认为这部分地址没有符号信息,希望以后版本的Kernel可以修复这个限制吧..

最后: 性能对比测试的任务就留给大家来试试了, 欢迎评论你们看到的变化!

希望本文所述对大家php程序设计有所帮助。

PHP 相关文章推荐
实用函数4
Nov 08 PHP
PHP防止表单重复提交的几种常用方法汇总
Aug 19 PHP
php银联网页支付实现方法
Mar 04 PHP
php超快高效率统计大文件行数
Jul 05 PHP
PHP使用redis消息队列发布微博的方法示例
Jun 22 PHP
PHP观察者模式原理与简单实现方法示例
Aug 25 PHP
laravel实现分页样式替换示例代码(增加首、尾页)
Sep 22 PHP
PHP面向对象五大原则之开放-封闭原则(OCP)详解
Apr 04 PHP
PHP实现微信退款的方法示例
Mar 26 PHP
Laravel5.1 框架响应基本用法实例分析
Jan 04 PHP
PHP7创建COOKIE和销毁COOKIE的实例方法
Feb 03 PHP
thinkphp5 + ajax 使用formdata提交数据(包括文件上传) 后台返回json完整实例
Mar 02 PHP
PHP表单数据写入MySQL数据库的代码
May 31 #PHP
PHP将页面中点击数量高的链接进行高亮显示的方法
May 30 #PHP
PHP如何实现跨域
May 30 #PHP
php while循环控制的简单实例
May 30 #PHP
Yii2中如何使用modal弹窗(基本使用)
May 30 #PHP
[原创]php求圆周率的简单实现方法
May 30 #PHP
smarty中改进truncate使其支持中文的方法
May 30 #PHP
You might like
聊天室php&mysql(二)
2006/10/09 PHP
PHP与SQL注入攻击[三]
2007/04/17 PHP
深入浅析Yii admin的权限控制
2016/08/31 PHP
删除重复数据的算法
2006/11/23 Javascript
怎样在JavaScript里写一个swing把数据插入数据库
2012/12/10 Javascript
JavaScript操纵窗口的方法小结
2013/06/28 Javascript
jquery mobile事件多次绑定示例代码
2013/09/13 Javascript
Nodejs全栈框架StrongLoop推荐
2014/11/09 NodeJs
js选择器全面解析
2016/06/27 Javascript
浅谈jQuery中的eq()与DOM中element.[]的区别
2016/10/28 Javascript
Bootstarp基本模版学习教程
2017/02/01 Javascript
详解JavaScript中return的用法
2017/05/08 Javascript
VUE多层路由嵌套实现代码
2017/05/15 Javascript
浅谈实现vue2.0响应式的基本思路
2018/02/13 Javascript
详解如何配置vue-cli3.0的vue.config.js
2018/08/23 Javascript
浅谈JavaScript 代码整洁之道
2018/10/23 Javascript
基于JS实现计算24点算法代码实例解析
2020/07/23 Javascript
jquery实现穿梭框功能
2021/01/19 jQuery
Python随机函数random()使用方法小结
2018/04/29 Python
深入了解Python iter() 方法的用法
2019/07/11 Python
使用keras时input_shape的维度表示问题说明
2020/06/29 Python
python 如何区分return和yield
2020/09/22 Python
利用CSS3实现圆角的outline效果的教程
2015/06/05 HTML / CSS
大学生个人推荐信范文
2013/11/25 职场文书
文言文形式的学生求职信
2013/12/03 职场文书
运动会广播稿100字
2014/01/11 职场文书
2014年国庆节演讲稿
2014/09/19 职场文书
群众路线领导干部个人对照检查材料(集锦)
2014/09/23 职场文书
缓刑期间思想汇报范文
2014/10/10 职场文书
幼儿园法制宣传日活动总结
2014/11/01 职场文书
中层干部考核评语
2015/01/04 职场文书
幼儿园小班个人总结
2015/02/12 职场文书
节约用电通知
2015/04/25 职场文书
原告离婚代理词
2015/05/23 职场文书
安全生产会议制度
2015/08/06 职场文书
ubuntu下常用apt命令介绍
2022/06/05 Servers