配置透明大页面;[always]、[madvise] 或

配置透明大页面;[always]、[madvise] 或

我们有一批通用的 Centos 7 LAMP 堆栈服务器,它们运行 apache 和底层 MariaDB 数据库。

来自RHEL 6 的 RedHat 性能调优文档

透明大页面 (THP) 为系统管理员和开发人员隐藏了使用大页面的复杂性。由于 THP 的目标是提高性能,其开发人员(来自社区和 Red Hat)已在各种系统、配置、应用程序和工作负载中测试和优化了 THP。这使得 THP 的默认设置能够提高大多数系统配置的性能。但是,不建议将 THP 用于数据库工作负载。

这听起来很棒,直到数据库部分。事实上,一些 MariaDB 选项(例如 TokuDB 引擎)实际上需要禁用 THP。

我发现很多关于禁用 THP 的指南都指导将默认配置从 更改transparent_hugepages= alwaysnever

然而,从RHEL 7 的 RedHat 性能调优文档

为了防止应用程序分配超过必要数量的内存资源,您可以在系统范围内禁用大页面,并仅在 MADV_HUGEPAGE madvise 区域内启用它们

如果我没看错的话,这transparent_hugepages= madvise似乎是一个更好的选择,允许从 THP 中受益的进程使用它们,而不允许那些没有受益的进程使用它们。

我确实找到了一篇文章建议采用这种方法。

为什么这不是默认选项?

在哪些情况下使用transparent_hugepages= never比更明智madvise

答案1

这是选择加入(madvise)和选择退出(始终)之间的区别。对 THP 敏感的应用程序即使在 下也可以选择退出transparent_hugepages=always。例如,使用 jemalloc 的应用程序对其特别敏感(redis、go rt、rust rt),jemalloc 在编译时作为分配器配置的一部分提供使用 MADV_NOHUGEPAGE 的选项。从内核 3.15(RHEL7 附带 3.10)开始,它们可以使用 在每个进程的基础上选择退出prctl(PR_SET_THP_DISABLE)

默认设置always通常没问题,因为数据局部性是进行大量分配的应用程序的常见属性。数据库是一个明显的例外,它们在访问大量大量分配中的小块时会受到影响(并且它们可以禁用 THP)。

内核文档透明大页面这表明这更像是一种调试选项,而不是推荐的解决方案。它只在软件存在错误时才transparent_hugepage=never有用;即当开发人员错误地使用 MADV_HUGEPAGE 时。transparent_hugepage=madvise

相关内容