我正在编写一个需要使用大页面的程序。
我正在尝试将libhugetlbfs lib用于ubuntu64。 我试图用已安装的lib的名称替换LD_LIBRARY变量,所以我将程序与它相关联。
在我的代码中,我经常调用malloc,如何确保我有一个大页面而不是常规页面?
答案 0 :(得分:1)
首先,您不需要链接libhugetlbfs来使用大页面。 实际上,您不必修改代码甚至重新链接二进制文件。
根据此HOWTO
块引用
使用largepages for malloc()(morecore)
此功能允许现有(动态链接)二进制可执行文件 为其所有malloc()调用使用hugepages。使用运行程序 自动hugepage malloc()功能,你必须设置几个 环境变量:
设置LD_PRELOAD = libhugetlbfs.so 这告诉动态链接器加载libhugetlbfs共享 图书馆,即使该计划最初与其无关。
注意:如果程序与libhugetlbfs链接,则预加载 库可能导致应用程序崩溃。你应该跳过这个 在这种情况下一步。
将LD_LIBRARY_PATH设置为包含libhugetlbfs.so的目录 只有在没有将libhugetlbfs.so安装到a时,才需要这样做 系统默认路径。如果设置LD_LIBRARY_PATH,请确保 引用的目录包含正确的库版本 (32位或64位)适合您要运行的二进制文件。
- 醇>
设置HUGETLB_MORECORE 这启用了largepage malloc()功能,指示libhugetlbfs 使用hugepage覆盖libc的普通morecore()函数 版本并将其用于malloc()。从这一点开始所有malloc()s 应该来自巨大的页面内存,直到它耗尽。这个选项可以 以两种方式指定:
使用默认的巨大页面大小: HUGETLB_MORECORE =是
使用特定的巨大页面大小: HUGETLB_MORECORE =
您需要做的就是(如果您没有链接到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,这是一种更简单的方法(但容易出现物理内存碎片问题)。