如何在 Linux 上为 C++ 应用程序分配“巨大”页面

2023-12-26

我在 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(使用前将#替换为@)

如何在 Linux 上为 C++ 应用程序分配“巨大”页面 的相关文章

随机推荐

  • 通过catch(...)从SEH异常中获取有意义的信息?

    早上好 编辑 这不是重复的 因为它具体涉及 SEH 而不是代码级引发的异常 我正在使用 SEH 来捕获一些不可靠的库引发的硬件错误 我想从包罗万象的异常中获取更多信息 下面的代码模拟了我正在做的事情 正如你所看到的 我正在使用 boost
  • 使用 Tridion Query 实施全文搜索

    我必须对基于 SDL Tridion WCMS 的网站实施全文搜索 对于如何使用 Tridion Query 实现全文搜索有什么建议或想法吗 SDL Tridion Content Delivery API 设计用于基于系统或自定义元数据和
  • DotLiquid/Liquid 访问字典

    我在用点液体 http github com formosatek dotliquid 模板引擎并尝试访问模板中的字典值 我已经将这个下降传递给模板 public class SomeDrop Drop public Dictionary
  • 当通过 QueryString 设置区域性时,本地化有效,但当区域性在路由中时则无效

    这是我的路线 app UseMvc routes gt routes MapRoute name defaultWithCulture template culture fa IR controller action Index id 但当
  • java.lang.IllegalArgumentException:服务未注册

    我有一个包含 webview 的应用程序 一切都很顺利 但在 android studio 的运行选项卡中 我收到以下消息 我的应用程序仍然运行良好 但它仍然困扰着我 我对这条消息了解不多 Exception thrown while un
  • PHP cURL 不存储会话 cookie...如何解决这个问题?

    我正在制作一个类来与我们公司的 API 进行通信 我使用curl 来发布数据并检索json 格式的响应 在代码的最后一部分 课后 我将用户登录到服务器 它给出了 true 但是当我尝试使用curl再次连接时 他说我没有登录 我已经完成了谷歌
  • 如何在路线更改时关闭导航菜单

    With react router dom 如何检测用户何时导航到新页面 我目前正在使用 react router dom 4 2 2 and react 15 6 1 我想在用户选择新的目标 URL 时关闭移动导航菜单 但我无法检测路线何
  • Android 位置“去散步”本身

    我正在研究一个项目的 GPS 部分 我想通过社区获得一些东西 我搜索了所有典型的 GPS 跳跃和漂移 并努力改进我得到的数据 但上周我得到了一些非常奇怪的数据 我无法确定 The application basically has a fo
  • UITableView 单元格中的图像不支持tintColor

    我有一个UITableView它由静态单元组成 在IB中我已经设置了每个UITableViewCell的样式为 Basic 并设置图像 参见屏幕截图 我的导航栏中的按钮尊重tintColor属性 但表视图中的图像没有 到目前为止 我已经完成
  • Python Pandas DataFrame 仅存储一个数字?

    AzureML 的 Python 脚本模块需要返回 Pandas DataFrame 我只想返回一个值 我这样做 result 7 dataframe1 pd DataFrame numpy zeros 1 dataframe1 0 0 r
  • 如何在高并发代码中提高 .NET 4.0 的垃圾收集器性能?

    我正在使用 NET Framework 4 中的任务并行库 特别是Parallel For and Parallel ForEach 但是 在并行化某些看起来应该在双核计算机上轻松并行化的任务时 我得到的速度非常平庸 在分析系统时 由于垃圾
  • javascript中“new Class”和“new Class()”有什么区别

    function ClassA this value 5 var obj1 new ClassA var obj2 new ClassA console log obj1 value console log obj2 value 两者都在控
  • ETags、IIS7、内核缓存策略(enableKernelCache)

    由两部分组成的问题 各部分密切相关 使用 IIS7 采用的默认 OOTB ETag 策略 为什么我们在浏览页面时看不到 If None Match 304 交互 例如 为空缓存请求返回的标头为 Content Type image png
  • 如何在python中使用空格分隔输入

    我想从用户那里获取以下单行内容 Abc 0 1 0 如何才能做到这一点 我试过 map int input split input and then split input split 我收到以下错误 File main py line 1
  • SceneKit 在 Xcode 12 中不会填满屏幕

    我正在尝试使用 SceneKit 进行练习并制作 IOS 游戏 在 Xcode 12 Beta 5 中 但无论我做什么 SceneView 都不会填满屏幕 这是使用 SceneKit 启动游戏时的默认代码 当我使用 Xcode 11 时 它
  • 在多个项目之间共享通用代码

    我有一个类库项目 其中包含我的项目中使用的常用代码 并且我使用 subversion 作为源代码控制 我对管理解决方案 项目和代码的可用性有一些疑问 我想在项目之间共享这个类库 当我更新它时 更新可以轻松地应用于所有项目 我在哪里可以找到这
  • Firebase Android onAuthStateChanged 调用两次

    我已经开始使用新的 Firebase SDK 当我进行用户登录时 我的 onAuthStateChanged 方法以相同的状态被调用两次 等用户登录 我确信我只将 AuthStateListener 添加到 FirebaseAuth 引用中
  • Charles Proxy 不适用于 7.0 以上的 Android 版本?

    我长期以来一直使用 Charles 来拦截请求和响应 但是当我尝试针对 Android Oreo 的 google Pixel 时 它一直给我握手异常 我知道他们对网络安全所做的某些改变毫无意义 任何形式的帮助将不胜感激 如果您在 Andr
  • 如何使用 XML::LibXML 自动缩进 XML 节点?

    我正在将节点添加到我的 XML 文档中 作为某些内部处理的一部分 但无法获取XML LibXML http search cpan org perldoc XML 3a 3aLibXML自动缩进添加的节点 我得到如下输出 这是我目前得到的
  • 如何在 Linux 上为 C++ 应用程序分配“巨大”页面

    我在 Linux 上有一个 C 应用程序 它对延迟非常敏感 我的内存使用量约为 2GB 因此对于 4kb 页面和 64 个 TLB 条目 我将遇到 TLB 未命中的情况 我在 Intel 开发人员手册中读到 2MB 或 4MB 巨大 页面仅