让你的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 相关文章推荐
PHP 验证码不显示只有一个小红叉的解决方法
Sep 30 PHP
php+mysql实现无限级分类
Nov 11 PHP
Zend Framework实现留言本分页功能(附demo源码下载)
Mar 22 PHP
PHP的Yii框架中过滤器相关的使用总结
Mar 29 PHP
PHP微信开发之查询微信精选文章
Jun 23 PHP
Linux平台PHP5.4设置FPM线程数量的方法
Nov 09 PHP
PHP基于新浪IP库获取IP详细地址的方法
May 04 PHP
yii2.0整合阿里云oss的示例代码
Sep 19 PHP
Laravel框架基于ajax实现二级联动功能示例
Jan 17 PHP
不常用但很实用的PHP预定义变量分析
Jun 25 PHP
PHP cookie与session会话基本用法实例分析
Nov 18 PHP
PHP快速导出百万级数据到CSV或者EXCEL文件
Nov 27 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
用header 发送cookie的php代码
2007/03/16 PHP
set_include_path和get_include_path使用及注意事项
2013/02/02 PHP
yii2多图上传组件的使用教程
2018/05/10 PHP
JavaScript 学习笔记一些小技巧
2010/03/28 Javascript
在chrome浏览器中,防止input[text]和textarea在聚焦时出现黄色边框的解决方法
2011/05/24 Javascript
node.js中的buffer.Buffer.isBuffer方法使用说明
2014/12/14 Javascript
DropDownList控件绑定数据源的三种方法
2016/12/24 Javascript
Javascript中return的使用与闭包详解
2017/01/11 Javascript
jQuery使用EasyUi实现三级联动下拉框效果
2017/03/08 Javascript
JS+canvas动态绘制饼图的方法示例
2017/09/12 Javascript
页面内锚点定位及跳转方法总结(推荐)
2019/04/24 Javascript
layui实现图片虚拟路径上传,预览和删除的例子
2019/09/25 Javascript
Vue组件基础用法详解
2020/02/05 Javascript
Python爬虫实战:分析《战狼2》豆瓣影评
2018/03/26 Python
python贪婪匹配以及多行匹配的实例讲解
2018/04/19 Python
python绘制中国大陆人口热力图
2018/11/07 Python
对Python的zip函数妙用,旋转矩阵详解
2018/12/13 Python
基于django ManyToMany 使用的注意事项详解
2019/08/09 Python
python判断单向链表是否包括环,若包含则计算环入口的节点实例分析
2019/10/23 Python
详解Python中打乱列表顺序random.shuffle()的使用方法
2019/11/11 Python
python实现高斯(Gauss)迭代法的例子
2019/11/20 Python
Python 基于FIR实现Hilbert滤波器求信号包络详解
2020/02/26 Python
基于Python快速处理PDF表格数据
2020/06/03 Python
Python基于opencv的简单图像轮廓形状识别(全网最简单最少代码)
2021/01/28 Python
印度最大的旅游网站:MakeMyTrip
2016/10/05 全球购物
制药工程专业应届生求职信
2013/09/24 职场文书
急诊科护士自我鉴定
2013/10/14 职场文书
服务承诺书格式
2014/05/21 职场文书
泸县召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
交心谈心活动总结
2015/05/11 职场文书
恰同学少年观后感
2015/06/08 职场文书
如何用threejs实现实时多边形折射
2021/05/07 Javascript
CSS 伪元素::marker详解
2021/06/26 HTML / CSS
Python 居然可以在 Excel 中画画你知道吗
2022/02/15 Python
MySQL数据库简介与基本操作
2022/05/30 MySQL
浅析JavaScript中的变量提升
2022/06/01 Javascript