让你的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中文编码小技巧
Dec 25 PHP
几个优化WordPress中JavaScript加载体验的插件介绍
Dec 17 PHP
php实现异步数据调用的方法
Dec 24 PHP
PHP中strncmp()函数比较两个字符串前2个字符是否相等的方法
Jan 07 PHP
PHP+apc+ajax实现的ajax_upload上传进度条代码
Jan 25 PHP
PHP接口继承及接口多继承原理与实现方法详解
Oct 18 PHP
PHP实现生成模糊图片的方法示例
Dec 21 PHP
php数据结构之顺序链表与链式线性表示例
Jan 22 PHP
PHP实现可精确验证身份证号码的工具类示例
May 31 PHP
实例讲解通过​PHP创建数据库
Jan 20 PHP
PHP Beanstalkd消息队列的安装与使用方法实例详解
Feb 21 PHP
Aliyun Linux 编译安装 php7.3 tengine2.3.2 mysql8.0 redis5的过程详解
Oct 20 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
phpMyAdmin 链接表的附加功能尚未激活的问题
2010/08/01 PHP
在windows服务器开启php的gd库phpinfo中未发现
2013/01/13 PHP
php对文件进行hash运算的方法
2015/04/03 PHP
Laravel构建即时应用的一种实现方法详解
2017/08/31 PHP
PHP封装的mysqli数据库操作类示例
2019/02/16 PHP
js格式化货币数据实现代码
2013/09/04 Javascript
jfreechart插件将数据展示成饼状图、柱状图和折线图
2015/04/13 Javascript
javascript封装的sqlite操作类实例
2015/07/17 Javascript
jquery 遍历数组 each 方法详解
2016/05/25 Javascript
第三篇Bootstrap网格基础
2016/06/21 Javascript
JS中正则表达式只有3种匹配模式(没有单行模式)详解
2016/07/28 Javascript
vue webpack开发访问后台接口全局配置的方法
2018/09/18 Javascript
JavaScript中变量提升和函数提升的详解
2020/08/07 Javascript
JS实现简易日历效果
2021/01/25 Javascript
[05:35]DOTA2英雄梦之声_第13期_拉比克
2014/06/21 DOTA
python查看列的唯一值方法
2018/07/17 Python
Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息示例
2018/07/18 Python
pybind11在Windows下的使用教程
2019/07/04 Python
英国最大的线上保健品零售商之一:Vitamin Planet
2016/12/01 全球购物
英国最大的在线蜡烛商店:Candles Direct
2019/03/26 全球购物
AURALog面试题软件测试方面
2013/10/22 面试题
EJB与JAVA BEAN的区别
2016/08/29 面试题
门卫岗位安全职责
2013/12/13 职场文书
办理暂住证介绍信
2014/01/11 职场文书
网上开商店的创业计划书
2014/01/19 职场文书
股东协议书范本
2014/04/14 职场文书
会议欢迎标语
2014/06/30 职场文书
“四风”查摆问题自我剖析材料
2014/09/27 职场文书
个人贷款授权委托书样本
2014/10/07 职场文书
单位未婚证明范本
2014/11/25 职场文书
大学生求职信怎么写
2015/03/19 职场文书
电影建党伟业观后感
2015/06/01 职场文书
美容院管理规章制度
2015/08/05 职场文书
详细聊聊浏览器是如何看闭包的
2021/11/11 Javascript
世界无敌的ICOM IC-R9500宽频接收机
2022/03/25 无线电
Docker与K8s关系介绍不会Docker也可以使用K8s
2022/06/25 Servers