使用libhugetlbfs来分配页面

时间:2017-05-23 20:13:16

标签: linux linux-kernel ubuntu-14.04 huge-pages

我正在编写一个需要使用大页面的程序。

我正在尝试将libhugetlbfs lib用于ubuntu64。 我试图用已安装的lib的名称替换LD_LIBRARY变量,所以我将程序与它相关联。

在我的代码中,我经常调用malloc,如何确保我有一个大页面而不是常规页面?

1 个答案:

答案 0 :(得分:1)

首先,您不需要链接libhugetlbfs来使用大页面。 实际上,您不必修改代码甚至重新链接二进制文件。

根据此HOWTO

  

块引用

     

使用largepages for malloc()(morecore)

     

此功能允许现有(动态链接)二进制可执行文件   为其所有malloc()调用使用hugepages。使用运行程序   自动hugepage malloc()功能,你必须设置几个   环境变量:

     
      
  1. 设置LD_PRELOAD = libhugetlbfs.so   这告诉动态链接器加载libhugetlbfs共享   图书馆,即使该计划最初与其无关。

         

    注意:如果程序与libhugetlbfs链接,则预加载       库可能导致应用程序崩溃。你应该跳过这个       在这种情况下一步。

  2.   
  3. 将LD_LIBRARY_PATH设置为包含libhugetlbfs.so的目录   只有在没有将libhugetlbfs.so安装到a时,才需要这样做   系统默认路径。如果设置LD_LIBRARY_PATH,请确保   引用的目录包含正确的库版本   (32位或64位)适合您要运行的二进制文件。

  4.   
  5. 设置HUGETLB_MORECORE   这启用了largepage malloc()功能,指示libhugetlbfs   使用hugepage覆盖libc的普通morecore()函数   版本并将其用于malloc()。从这一点开始所有malloc()s   应该来自巨大的页面内存,直到它耗尽。这个选项可以   以两种方式指定:

         

    使用默认的巨大页面大小:      HUGETLB_MORECORE =是

         

    使用特定的巨大页面大小:      HUGETLB_MORECORE =

  6.   

您需要做的就是(如果您没有链接到libhugetlbfs): 以

运行您的程序
LD_PRELOAD=libhugetlbfs.so LD_LIBRARY_PATH=LIBHUGEFS_DIR:$LD_LIBRARY_PATH HUGETLB_MORECORE=yes your_binary

或只是

LD_LIBRARY_PATH=LIBHUGEFS_DIR:$LD_LIBRARY_PATH HUGETLB_MORECORE=yes your_binary

如果您的二进制文件与libhugetlbfs链接

其中LIBHUGEFS_DIR需要由libhugetlbfs.so所在的目录替换,而your_binary需要替换为您的程序名称。

将系统配置为支持大页面也很重要。这可以通过多种方式完成,这是最简单的方法:

echo "2000000" > /proc/sys/vm/nr_overcommit_hugepages

有关详细信息,请参阅链接的HOWTO。

重新链接到libhugefs还有其他好处 - 它允许二进制/共享对象中的某些段重新映射到大页面。

请注意,如果您在代码中直接使用mmap调用或者使用自定义分配器,则问题会更复杂。

另外请考虑使用默认启用的Transparent Huge Pages,这是一种更简单的方法(但容易出现物理内存碎片问题)。