何时关闭redis的透明大页

问题描述 投票:0回答:5

根据redis docs,建议禁用透明大页。

如果redis服务器和应用程序之间共享机器,指导是否相同。

此外,对于其他技术,我还阅读了指南,在设置服务器时应为所有生产环境禁用 THP。这种先发制人的做法是否也适用于redis,还是必须首先严格监控延迟问题才能决定关闭THP?

redis
5个回答
13
投票

注意:在最初撰写此答案时,仍然建议关闭 THP。从那时起,情况发生了变化,不再建议关闭 THP,除非 您要持久保存到磁盘。我只是为了后代才把这个答案留在这里。

将其关闭。问题在于 THP 如何移动内存以尝试保留或创建连续页面。有些应用程序可以容忍这一点,但大多数数据库不能,并且它会导致间歇性的性能问题,有些甚至非常严重。无论如何,这并不是 Redis 独有的。

对于您的应用程序,尤其是JAVA应用程序,请设置真正的HugePages并保留透明类型。如果您这样做,只需确保为应用程序和 Redis 正确分配内存即可。虽然我不得不说,我可能不建议在同一个实例/服务器/虚拟机上运行应用程序和 Redis。


10
投票

关闭透明大页是一个坏主意,redis 不再推荐它

您应该做的是确保transparent_hugepage 未设置为

always
。 (这是最新版本的 redis 检查的内容。)您可以使用以下命令检查设置的当前值:

$ cat /sys/kernel/mm/transparent_hugepage/enabled

并像这样纠正它:

# echo madvise >/sys/kernel/mm/transparent_hugepage/enabled

尽管可能不需要采取任何操作,因为

madvise
通常是最近 Linux 发行版中的默认设置。

一些背景:

  • transparent_hugepage=always:可以强制应用程序使用大页面,除非他们使用 madvise 选择退出。这有很多问题并且很少启用。
  • transparent_hugepage = never:不满足大页分配,即使应用程序使用 madvise 请求它
  • transparent_hugepage = madvise:允许应用程序选择使用大页。这通常是一个好主意,因为大页面可以提高某些应用程序的性能,但此设置不会强制它们应用于不选择加入的应用程序,如 redis

6
投票
2025 年小更新:在内核命令行中设置

transparent_hugepage=always

 可以提高
所有应用程序的性能。

只有某些特定应用程序的性能会因此设置而下降,必须对它们进行命名和修复。


搜索“透明大页”会产生有关如何禁用它们的最佳结果,这是相当烦人的,因为 Redis 和其他一些数据库无法在不降低性能的情况下处理透明大页。

这些应用程序应执行以下任一操作:

    使用
  • prctl(PR_SET_THP_DISABLE, ...)
     调用选择不使用透明大页面。
  • 由脚本启动,该脚本在数据库进程之前调用它们。当无法修改现有应用程序时,
  • fork/exec
     会被子进程/线程继承。
  • PR_SET_THP_DISABLE
自 2014 年左右的 Linux 3.15 起就可用,因此这些数据库没有理由不提及这个解决方案,而不是向用户提供这个糟糕/恐慌的建议来禁用整个系统的透明大页面。

这个问题提出 3 年后,Redis 获得了 

prctl(PR_SET_THP_DISABLE, ...)

配置选项,默认情况下可以自行调用

disable-thp

prctl(PR_SET_THP_DISABLE, ...)
设置为

/sys/kernel/mm/transparent_hugepage/enabled

 时,我的生产内存密集型流程速度提高了 5-15%。许多流行的桌面应用程序都从
always
透明大页面中受益匪浅。
这就是为什么我无法欣赏那些“透明大页面”的搜索结果,其中充斥着 Redis 建议禁用它们的垃圾邮件。这是来自 Redis 的
紧急建议

,而不是

最佳实践

由于碎片整理成本,THP 施加的开销仅发生在内存分配期间。

-1
投票
如果您的 Redis 实例具有(接近)恒定的内存占用量,则您只能从 THP 中受益。同样适用于 java 或任何其他具有自己的内存管理功能的长期服务。预分配一次内存即可受益。

当有可以启动的内核参数时,为什么还要玩这样的回声游戏?

transparent_hugepage=从不

-7
投票

© www.soinside.com 2019 - 2024. All rights reserved.