我正在编写一个需要使用大页面的程序。
我正在尝试将 libhugetlbfs 库用于 ubuntu64。我试图用安装的库的名称替换 LD_LIBRARY 变量,并将我的程序链接到它。
在我定期调用 malloc 的代码中,如何确保我得到一个大页面而不是常规页面?
我正在编写一个需要使用大页面的程序。
我正在尝试将 libhugetlbfs 库用于 ubuntu64。我试图用安装的库的名称替换 LD_LIBRARY 变量,并将我的程序链接到它。
在我定期调用 malloc 的代码中,如何确保我得到一个大页面而不是常规页面?
首先,你不需要链接到 libhugetlbfs 来使用大页面。事实上,您不必修改代码甚至重新链接二进制文件。
根据这个HOWTO
块引用
为 malloc() 使用大页面(morecore)
此功能允许现有(动态链接)二进制可执行文件对其所有 malloc() 调用使用大页面。要使用自动大页面 malloc() 功能运行程序,您必须设置几个环境变量:
设置 LD_PRELOAD=libhugetlbfs.so 这告诉动态链接器加载 libhugetlbfs 共享库,即使程序最初没有链接到它。
注意:如果程序链接到 libhugetlbfs,预加载库可能会导致应用程序崩溃。在这种情况下,您应该跳过此步骤。
将 LD_LIBRARY_PATH 设置为包含 libhugetlbfs.so 的目录 仅当您尚未将 libhugetlbfs.so 安装到系统默认路径时才需要这样做。如果您设置 LD_LIBRARY_PATH,请确保引用的目录包含适合您要运行的二进制文件的库的正确版本(32 位或 64 位)。
设置 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 调用或使用自定义分配器,则问题会更加复杂。
另外请考虑只使用默认启用的透明大页面,这是一种更简单的方法(但容易出现物理内存碎片问题)。