为了能启用大页,不能按照常规的方法启动应用程序,需要按照下面的格式启动:
HUGETLB_MORECORE=yesLD_PRELOAD=libhugetlbfs.so ./your_program
这种方法会加载libhugetlbfs库,用来替换标准库。具体的操作就是替换标准的malloc为大页的malloc。此时,程序申请内存就是大页内存了。
按照上述四个步骤即可启用大页内存,所以启用大页还是很容易的。
如果你的应用程序乱序访存很严重,那么大页内存会带来比较大的收益,正好我们现在做的听歌识曲就是这样的应用,所以优化效果很明显,下面是曲库为25w时,启用大页和不启用大页的程序性能。
可以看出,启用大页内存之后,程序的访问时间显著下降,性能提升接近50%,达到了性能要求。
任何优化手段都有它适用的范围,大页内存也不例外。前面我们一直强调,只有耗费的内存巨大、访存随机而且访存是瓶颈的程序大页内存才会带来很明显的 性能提升。在我们的听歌识曲系统中,耗费的内存接近100G,而且内存访问都是乱序访问,所以才带来明显的性能提升。网上的例子一直在用Oracle数据 库作为例子不是没有道理的,这是因为Oracle数据库耗费的内存也很巨大,而且数据库的增删查改也缺乏局部性。数据库背后的增删查改基本上是对B树进行 操作,树的操作一般缺少局部性。
什么样的程序局部性较差呢?我个人认为采用哈希和树策略实现的程序往往具有较差的访存局部性,这时如果程序性能不好可以尝试大页内存。相反,单纯的 数组遍历或者图的广度遍历等操作,具有很好的访存局部性,采用大页内存很难获得性能提升。本人曾经尝试在搜狗语音识别解码器上启用大页内存,希望可以获得 性能提升,但是效果令人失望,没有提升反而导致性能降低。这是因为语音识别解码器从本质上来讲就是一个图的广搜,具有很好的访存局部性,而且访存不是性能 瓶颈,这时采用大页内存可能会带来其他开销,导致性能下降。
本博客以听歌识曲的例子详细介绍了大页内存的原理和使用方法。由于大数据的兴盛,目前应用程序处理的数据量越来越大,而且数据的访问越来越不规整, 这些条件给大页内存的使用带来了可能。所以,如果你的程序跑得慢,而且满足大页内存的使用条件,那就尝试一下吧,反正很简单又没损失,万一能带来不错的效 果呢。
大页内存(HugePages)