我在 Linux 上有一个 C++ 应用程序,它对延迟非常敏感。我的内存使用量约为 2GB,因此对于 4kb 页面和 64 个 TLB 条目,我将遇到 TLB 未命中的情况。
我在 Intel 开发人员手册中读到,2MB(或 4MB?)“巨大”页面仅将 TLB 条目数量减少一半,因此内存范围的增加抵消了 TLB 条目的减少,这对性能来说会更好。
如何在 C++ 应用程序中使用“大”页分配内存?我应该注意哪些权衡?
我的 Linux 是 Red Hat 发行版。
您也可以尝试使用透明大页支持 https://www.kernel.org/doc/Documentation/vm/transhuge.txt它可用于过去几年的任何内核(至少 3.x 和 4.x 范围内的任何内核以及各种 2.6.x 内核)。
主要好处是您不需要设置任何特殊的“hugetlbfs”,它“就可以工作”。缺点是无法保证:内核may用大页面满足您的分配if有些条件已满足,有些条件可用。不像hugetlbfs
它在启动时保留固定数量的大页,这些大页只能通过特定的调用来使用,透明大页从通用内存池中划分出大页。这需要连续的 2MB 物理内存块,随着系统由于物理内存碎片而保持正常运行时间,这些物理内存块可能会变得很少。
此外,还有各种内核可调参数会影响您是否获得大页面,其中最重要的是/sys/kernel/mm/transparent_hugepage/enabled
.
你最好的选择是在 2MB 边界上分配块posix_memalign
然后做一个madvise(MADV_HUGEPAGE)
在分配的区域上before第一次触摸它。它也适用于像这样的变体aligned_alloc
。根据我的经验,在具有/sys/kernel/mm/transparent_hugepage/enabled
set to always
这通常会导致一个巨大的页面。然而,我主要在具有大量可用内存和不太长的正常运行时间的系统上使用。
如果您使用 2GB 内存,您可能会从大页面中获得显着的好处。如果您将其全部分配在小块中,例如通过malloc
透明大页很有可能不会启动,因此您还可以考虑以 THP 感知的方式分配任何使用大量内存的内容(通常是单个对象类型)。
我也写过图书馆 https://github.com/travisdowns/page-info以确定您是否实际上有大页来自任何给定的分配。这在生产应用程序中可能没有用,但如果您尝试使用 THP,它可能是一个有用的诊断,因为至少您可以确定是否获得了它们。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)