0

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

我正在尝试将 libhugetlbfs 库用于 ubuntu64。我试图用安装的库的名称替换 LD_LIBRARY 变量,并将我的程序链接到它。

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

4

1 回答 1

3

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

根据这个HOWTO

块引用

为 malloc() 使用大页面(morecore)

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

  1. 设置 LD_PRELOAD=libhugetlbfs.so 这告诉动态链接器加载 libhugetlbfs 共享库,即使程序最初没有链接到它。

    注意:如果程序链接到 libhugetlbfs,预加载库可能会导致应用程序崩溃。在这种情况下,您应该跳过此步骤。

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

  3. 设置 HUGETLB_MORECORE 这将启用大页面 malloc() 功能,指示 libhugetlbfs 使用大页面版本覆盖 libc 的正常 morecore() 功能并将其用于 malloc()。从这一点开始,所有 malloc() 都应该来自大页内存,直到它用完。可以通过两种方式指定此选项:

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

    要使用特定的大页面大小: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 调用或使用自定义分配器,则问题会更加复杂。

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

于 2017-10-29T12:18:07.340 回答