c++ - 如何在 Linux 上为 C++ 应用程序分配 "huge"页面

标签 c++ linux performance optimization memory-management

我在 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/

相关文章:

linux - 每天检查目录是否有新文件 - linux bash 脚本

linux - 我在 linux shell 中的命令有一些奇怪的输出

c# - 将字符串中单词的第一个字符大写

c# - 'split' 基于条件的通用列表的最(性能)最有效和可读的方法是什么?

c++ - "Undefined reference to"使用 Lua

c++ - Cmake 通过全名而不是明确地说短的来寻找 boost lib

c++ - cairo 上下文中的鼠标事件

c++ - QThread - 没有这样的插槽

linux - 下载 tar.gz 包时不支持的协议(protocol)

database - 如何在维护历史和当前数据时获得性能?