我们有一堆通用的 Centos 7 LAMP 堆栈服务器,它们使用底层 MariaDB 数据库运行 apache。
来自RHEL 6 的 RedHat Performance Tuning 文档:
Trasparent Hugepages (THP) 隐藏了系统管理员和开发人员使用大页面的大部分复杂性。由于 THP 的目标是提高性能,其开发人员(来自社区和红帽)已经在广泛的系统、配置、应用程序和工作负载中测试和优化了 THP。这允许 THP 的默认设置来提高大多数系统配置的性能。但是,不建议将 THP 用于数据库工作负载。
这听起来很棒,直到数据库部分。事实上,某些 MariaDB 选项(例如 TokuDB 引擎)实际上需要禁用 THP。
我找到的许多禁用 THP 的指南都指示将默认配置从 更改transparent_hugepages= always
为never
.
但是,来自RHEL 7 的 RedHat Performance Tuning 文档:
为防止应用程序分配不必要的内存资源,您可以在系统范围内禁用大页面,并仅在 MADV_HUGEPAGE madvise 区域内启用它们
如果我没看错,这transparent_hugepages= madvise
似乎是一个更好的选择,允许受益于 THP 的进程使用它们,而那些不使用的进程则不使用它们。
我确实找到了一篇建议这种方法的文章。
为什么这不是默认选项?
有没有使用比使用transparent_hugepages= never
更明智的情况madvise
?
这是选择加入(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
更像是一种调试选项,而不是推荐的解决方案。transparent_hugepage=madvise
仅在软件有错误时才可取;IE。当开发人员错误地使用 MADV_HUGEPAGE 时。