根据redis docs,建议禁用透明大页。
如果redis服务器和应用程序之间共享机器,指导是否相同。
此外,对于其他技术,我还阅读了指南,在设置服务器时应为所有生产环境禁用 THP。这种先发制人的做法是否也适用于redis,还是必须首先严格监控延迟问题才能决定关闭THP?
注意:在最初撰写此答案时,仍然建议关闭 THP。从那时起,情况发生了变化,不再建议关闭 THP,除非 您要持久保存到磁盘。我只是为了后代才把这个答案留在这里。
将其关闭。问题在于 THP 如何移动内存以尝试保留或创建连续页面。有些应用程序可以容忍这一点,但大多数数据库不能,并且它会导致间歇性的性能问题,有些甚至非常严重。无论如何,这并不是 Redis 独有的。
对于您的应用程序,尤其是JAVA应用程序,请设置真正的HugePages并保留透明类型。如果您这样做,只需确保为应用程序和 Redis 正确分配内存即可。虽然我不得不说,我可能不建议在同一个实例/服务器/虚拟机上运行应用程序和 Redis。
关闭透明大页是一个坏主意,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
可以提高所有应用程序的性能。 只有某些特定应用程序的性能会因此设置而下降,必须对它们进行命名和修复。
这些应用程序应执行以下任一操作:
prctl(PR_SET_THP_DISABLE, ...)
调用选择不使用透明大页面。
fork/exec
会被子进程/线程继承。
PR_SET_THP_DISABLE
这个问题提出 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 施加的开销仅发生在内存分配期间。transparent_hugepage=从不