让你的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 相关文章推荐
ADODB的数据库封包程序库
Dec 31 PHP
PHP 实用代码收集
Jan 22 PHP
PHP获取表单textarea数据中的换行问题
Sep 10 PHP
php 伪造本地文件包含漏洞的代码
Nov 03 PHP
PHP批量检测并去除文件BOM头代码实例
May 08 PHP
PHP中echo,print_r与var_dump区别分析
Sep 29 PHP
将PHP从5.3.28升级到5.3.29时Nginx出现502错误
May 09 PHP
php操作memcache缓存方法分享
Jun 03 PHP
PHP并发多进程处理利器Gearman使用介绍
May 16 PHP
PHP中字符串长度的截取用法示例
Jan 12 PHP
PHP去除字符串最后一个字符的三种方法实例
Mar 01 PHP
PHP+ajax实现上传、删除、修改单张图片及后台处理逻辑操作详解
Feb 12 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的控制语句
2006/10/09 PHP
PHP语言中global和$GLOBALS[]的分析 之二
2012/02/02 PHP
ThinkPHP3.1新特性之动态设置自动完成及自动验证示例代码
2014/06/23 PHP
php自定义函数实现二维数组按指定key排序的方法
2016/09/29 PHP
PHPStrom 新建FTP项目以及在线操作教程
2016/10/16 PHP
php使用json_decode后数字对象转换成了科学计数法的解决方法
2017/02/20 PHP
jQuery选择器源码解读(二):select方法
2015/03/31 Javascript
jQuery点击改变class并toggle及toggleClass()方法定义用法
2015/12/11 Javascript
浅析javascript的return语句
2015/12/15 Javascript
Bootstrap3学习笔记(三)之表格
2016/05/20 Javascript
jQuery Validate验证表单时多个name相同的元素只验证第一个的解决方法
2016/12/24 Javascript
AngularJS框架中的双向数据绑定机制详解【减少需要重复的开发代码量】
2017/01/19 Javascript
jquery实现提示语淡入效果
2017/05/05 jQuery
JavaScript实现时间表动态效果
2017/07/15 Javascript
ES6解构赋值的功能与用途实例分析
2017/10/31 Javascript
全面了解JavaScript的作用域链
2019/04/03 Javascript
基于Bootstrap和JQuery实现动态打开和关闭tab页的实例代码
2019/06/10 jQuery
基于JavaScript实现十五拼图代码实例
2020/04/26 Javascript
通过滑动翻页效果实现和移动端click事件问题
2021/01/26 Javascript
python 将字符串转换成字典dict
2013/03/24 Python
Python os模块介绍
2014/11/30 Python
python退出命令是什么?详解python退出方法
2018/12/10 Python
python3 实现调用串口功能
2019/12/26 Python
Python+Kepler.gl轻松制作酷炫路径动画的实现示例
2020/06/02 Python
Mixbook加拿大:照片书,照片卡,剪贴簿,年历和日历
2017/02/21 全球购物
马来西亚航空官方网站:Malaysia Airlines
2017/07/28 全球购物
网络工程师面试(三木通信技术有限公司)
2013/06/05 面试题
深圳茁壮笔试题
2015/05/28 面试题
总裁岗位职责
2013/12/04 职场文书
简单英文演讲稿
2014/01/01 职场文书
中式面点餐厅创业计划书
2014/01/29 职场文书
历史专业学生的自我评价
2014/02/28 职场文书
2014年毕业演讲稿范文
2014/05/13 职场文书
优秀员工事迹材料
2014/12/20 职场文书
2015年办公室工作总结范文
2015/03/31 职场文书
我的1919观后感
2015/06/03 职场文书