我在 Linux 上有一个 C++ 应用程序,它对延迟非常敏感。我的内存使用量约为 2GB,因此对于 4kb 页面和 64 个 TLB 条目,我将遇到 TLB 未命中。
我在英特尔开发人员手册中阅读了 2MB(或 4MB?)“巨大”页面只会将 TLB 条目的数量减少一半,因此内存范围的增加抵消了 TLB 条目的减少,并且会更好地提高性能.
如何在 C++ 应用程序中使用“巨大”页面分配内存?有什么我应该注意的取舍吗?
我的 Linux 是 Red Hat 发行版。
最佳答案
您也可以尝试使用transparent huge page support它在过去几年的任何内核上都可用(至少 3.x 和 4.x 范围内的任何内核以及各种 2.6.x 内核)。
主要好处是您不需要设置任何特殊的“hugetlbfs”,它“可以正常工作”。缺点是不能保证:内核可能满足您对大页面的分配如果满足某些条件并且某些条件可用。不同于 hugetlbfs
在启动时保留固定数量的巨页,这些巨页只能通过特定的调用获得,透明巨页从通用内存池中切出巨页。这需要连续的 2MB 物理内存块,由于物理内存碎片导致系统保持正常运行时间,这可能会变得很少。
此外,有多种内核可调参数会影响您是否获得大页面,其中最重要的是 /sys/kernel/mm/transparent_hugepage/enabled
。
您最好的选择是使用 posix_memalign
在 2MB 边界上分配 block ,然后在分配的区域上执行 madvise(MADV_HUGEPAGE)
< strong>第一次接触之前。它也适用于像 aligned_alloc
这样的变体。根据我的经验,在将 /sys/kernel/mm/transparent_hugepage/enabled
设置为 always
的系统上,这通常会导致大页面。但是,我主要在具有大量可用内存且正常运行时间不太长的系统上使用。
如果您使用 2GB 内存,您可能会从大页面中获得显着的好处。如果您将所有这些都分配在小块中,例如通过 malloc
很有可能透明的大页面不会启动,因此您还可以考虑以 THP 感知方式分配正在使用大部分内存的任何内容(通常是单个对象类型)。
我还写了 a library确定您是否从任何给定的分配中实际获得了大页面。这在生产应用程序中可能没有用,但如果您尝试使用 THP,它可能是一个有用的诊断,因为至少您可以确定您是否获得了它们。
关于c++ - 如何在 Linux 上为 C++ 应用程序分配 "huge"页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32652833/