【发布时间】:2017-07-24 07:25:14
【问题描述】:
根据 redis docs,建议禁用透明大页面。
如果机器在 redis 服务器和应用程序之间共享,指导是否相同。
此外,对于其他技术,我还阅读了guidance,在设置服务器时应为所有生产环境禁用 THP。这种先发制人是否也适用于redis,还是必须先严格监控延迟问题才能决定关闭THP?
【问题讨论】:
标签: redis
根据 redis docs,建议禁用透明大页面。
如果机器在 redis 服务器和应用程序之间共享,指导是否相同。
此外,对于其他技术,我还阅读了guidance,在设置服务器时应为所有生产环境禁用 THP。这种先发制人是否也适用于redis,还是必须先严格监控延迟问题才能决定关闭THP?
【问题讨论】:
标签: redis
关闭它。问题在于 THP 如何移动内存以尝试保持或创建连续页面。一些应用程序可以容忍这一点,大多数数据库不能,它会导致间歇性的性能问题,有些非常糟糕。这绝不是 Redis 独有的。
对于您的应用程序,特别是如果它是 JAVA,请设置真正的 HugePages 并将透明的品种排除在外。如果这样做,请确保为应用程序和 redis 正确分配内存。虽然我不得不说,但我可能不建议在同一个实例/服务器/虚拟机上同时运行应用程序和 redis。
【讨论】:
echo never > /sys/kernel/mm/transparent_hugepage/enabled 和 echo never > /sys/kernel/mm/transparent_hugepage/defrag,对吗?
既然有可以启动的内核参数,为什么还要玩这样的回声游戏?
transparent_hugepage=从不
【讨论】:
由于碎片整理成本,THP 施加的开销仅发生在内存分配期间。
如果您的 redis 实例具有(几乎)恒定的内存占用,您只能从 THP 中受益。同样适用于to java 或任何其他进行自己的内存管理的长期服务。预分配内存一次即可受益。
【讨论】:
关闭透明大页面是个坏主意,redis no longer recommends it。
您应该做的是确保未将 transparent_hugepage 设置为 always。 (This is what recent versions of redis check for.) 您可以通过以下方式检查设置的当前值:
$ cat /sys/kernel/mm/transparent_hugepage/enabled
并像这样更正它:
# echo madvise >/sys/kernel/mm/transparent_hugepage/enabled
尽管可能不需要任何操作,因为 madvise 通常是最近的 linux 发行版中的默认设置。
一些背景:
【讨论】:
搜索“透明大页面”会产生关于如何禁用它们的最佳结果,这是相当烦人的,因为 Redis 和其他一些数据库无法在不降低性能的情况下处理透明大页面。
这些应用程序应该执行以下任何操作:
prctl(PR_SET_THP_DISABLE, ...) 调用选择不使用透明大页面。fork/exec 数据库进程之前执行此调用的脚本启动。 PR_SET_THP_DISABLE 在无法修改现有应用程序的情况下被子进程/线程继承。prctl(PR_SET_THP_DISABLE, ...) 自 2014 年左右的 Linux 3.15 以来一直可用,因此这些数据库没有理由不提及此解决方案,而是向其用户提供这种糟糕/恐慌的建议,以禁用整个系统的透明大页面.
在提出这个问题 3 年后,默认情况下,Redis 让 disable-thp config option 自行调用 prctl(PR_SET_THP_DISABLE, ...)。
在将/sys/kernel/mm/transparent_hugepage/enabled 设置为always 时,我的生产内存密集型进程的运行速度提高了 5-15%,这就是为什么我无法理解那些带有 Redis 建议禁用它们的“透明大页面”的搜索结果。这个建议很糟糕。
【讨论】: