热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

大页内存(HugePages)

原文转载自:http:blog.csdn.netyutianzuijinarticledetails41912871今天给大家介绍一种比较新奇的程序性能优化方法—大页内存(Huge

原文转载自:http://blog.csdn.net/yutianzuijin/article/details/41912871

今天给大家介绍一种比较新奇的程序性能优化方法—大页内存(HugePages),简单来说就是通过增大操作系统页的大小来减小页表,从而避免快表 缺失。这方面的资料比较贫乏,而且网上绝大多数资料都是介绍它在Oracle数据库中的应用,这会让人产生一种错觉:这种技术只能在Oracle数据库中 应用。但其实,大页内存可以算是一种非常通用的优化技术,应用范围很广,针对不同的应用程序,最多可能会带来50%的性能提升,优化效果还是非常明显的。 在本博客中,将通过一个具体的例子来介绍大页内存的使用方法。

       在介绍之前需要强调一点,大页内存也有适用范围,程序耗费内存很小或者程序的访存局部性很好,大页内存很难获得性能提升。所以,如果你面临的程序优化问题有上述两个特点,请不要考虑大页内存。后面会详细解释为啥具有上述两个特点的程序大页内存无效。

1. 背景

       近期一直在公司从事听歌识曲项目的开发,详细内容可参考:基于指纹的音乐检索,目前已上线到搜狗语音云开放平台。 在开发的过程中,遇到一个很严重的性能问题,单线程测试的时候性能还能达到要求,但是在多线程进行压力测试的时候,算法最耗时的部分突然变慢了好几倍!后 来经过仔细调试,发现最影响性能的居然是一个编译选项-pg,去掉它之后性能会好很多,但是还是会比单线程的性能慢2倍左右,这就会导致系统的实时率达到 1.0以上,响应能力严重下降。

       通过更加仔细的分析,我们发现系统最耗时的部分是访问指纹库的过程,但是这部分根本就没有优化余地,只能换用内存带宽更高的机器。换用内存带宽更高的机器 确实带来了不少性能的提升,但是还是无法达到要求。就在山重水尽的情况下,无意中看到MSRA的洪春涛博士在微博中提到他们用大页内存对一个随机数组的访问问题进行优化获得了很好的性能提升。然后就向他求助,终于通过大页内存这种方法使系统性能进一步提升,实时率也降到了0.4左右。圆满达成目标!

2. 基于指纹的音乐检索简介

检索过程其实和搜索引擎一样,音乐指纹就和搜索引擎中的关键词等价,指纹库就等价于搜索引擎的后台网页库。指纹库的构造和搜索引擎的网页库也是一样,采用倒排索引形式。如下图:

技术分享技术分享

  1. if [ ! -d /search/music/libhugetlbfs ]; then  
  2.     mkdir /search/music/libhugetlbfs  
  3. fi  
  4. mount -t hugetlbfs hugetlbfs /search/music/libhugetlbfs  

4. 运行应用程序

为了能启用大页,不能按照常规的方法启动应用程序,需要按照下面的格式启动:

HUGETLB_MORECORE=yesLD_PRELOAD=libhugetlbfs.so ./your_program

这种方法会加载libhugetlbfs库,用来替换标准库。具体的操作就是替换标准的malloc为大页的malloc。此时,程序申请内存就是大页内存了。

按照上述四个步骤即可启用大页内存,所以启用大页还是很容易的。

6. 大页内存的优化效果

如果你的应用程序乱序访存很严重,那么大页内存会带来比较大的收益,正好我们现在做的听歌识曲就是这样的应用,所以优化效果很明显,下面是曲库为25w时,启用大页和不启用大页的程序性能。

技术分享

可以看出,启用大页内存之后,程序的访问时间显著下降,性能提升接近50%,达到了性能要求。

7. 大页内存的使用场景

任何优化手段都有它适用的范围,大页内存也不例外。前面我们一直强调,只有耗费的内存巨大、访存随机而且访存是瓶颈的程序大页内存才会带来很明显的 性能提升。在我们的听歌识曲系统中,耗费的内存接近100G,而且内存访问都是乱序访问,所以才带来明显的性能提升。网上的例子一直在用Oracle数据 库作为例子不是没有道理的,这是因为Oracle数据库耗费的内存也很巨大,而且数据库的增删查改也缺乏局部性。数据库背后的增删查改基本上是对B树进行 操作,树的操作一般缺少局部性。

什么样的程序局部性较差呢?我个人认为采用哈希和树策略实现的程序往往具有较差的访存局部性,这时如果程序性能不好可以尝试大页内存。相反,单纯的 数组遍历或者图的广度遍历等操作,具有很好的访存局部性,采用大页内存很难获得性能提升。本人曾经尝试在搜狗语音识别解码器上启用大页内存,希望可以获得 性能提升,但是效果令人失望,没有提升反而导致性能降低。这是因为语音识别解码器从本质上来讲就是一个图的广搜,具有很好的访存局部性,而且访存不是性能 瓶颈,这时采用大页内存可能会带来其他开销,导致性能下降。

8. 总结

本博客以听歌识曲的例子详细介绍了大页内存的原理和使用方法。由于大数据的兴盛,目前应用程序处理的数据量越来越大,而且数据的访问越来越不规整, 这些条件给大页内存的使用带来了可能。所以,如果你的程序跑得慢,而且满足大页内存的使用条件,那就尝试一下吧,反正很简单又没损失,万一能带来不错的效 果呢。

大页内存(HugePages)


推荐阅读
author-avatar
酱油丸子-310
这个家伙很懒,什么也没留下!
Tags | 热门标签
RankList | 热门文章
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有