配置透明大页;[总是]、[madvise] 或 [从不]

Art*_*rth 7 redhat rhel7

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

来自RHEL 6RedHat Performance Tuning 文档

Trasparent Hugepages (THP) 向系统管理员和开发人员隐藏了使用大页面的大部分复杂性。由于 THP 的目标是提高性能,因此其开发人员(来自社区和红帽)已经在广泛的系统、配置、应用程序和工作负载中测试和优化了 THP。这允许 THP 的默认设置提高大多数系统配置的性能。但是,不建议将 THP 用于数据库工作负载。

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

很多导游,我发现禁用THP请示更改默认配置transparent_hugepages= alwaysnever

但是,来自RHEL 7RedHat Performance Tuning 文档

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

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

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

为什么这不是默认选项?

有没有transparent_hugepages= never比使用更明智的情况madvise

And*_*zek 5

这是选择加入(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 时。