我们有一批通用的 Centos 7 LAMP 堆栈服务器,它们运行 apache 和底层 MariaDB 数据库。
透明大页面 (THP) 为系统管理员和开发人员隐藏了使用大页面的复杂性。由于 THP 的目标是提高性能,其开发人员(来自社区和 Red Hat)已在各种系统、配置、应用程序和工作负载中测试和优化了 THP。这使得 THP 的默认设置能够提高大多数系统配置的性能。但是,不建议将 THP 用于数据库工作负载。
这听起来很棒,直到数据库部分。事实上,一些 MariaDB 选项(例如 TokuDB 引擎)实际上需要禁用 THP。
我发现很多关于禁用 THP 的指南都指导将默认配置从 更改transparent_hugepages= always
为never
。
为了防止应用程序分配超过必要数量的内存资源,您可以在系统范围内禁用大页面,并仅在 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