【问题标题】:When to turn off Transparent Huge Pages for redis何时关闭 Redis 的透明大页面
【发布时间】:2017-07-24 07:25:14
【问题描述】:

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

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

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

【问题讨论】:

    标签: redis


    【解决方案1】:

    关闭它。问题在于 THP 如何移动内存以尝试保持或创建连续页面。一些应用程序可以容忍这一点,大多数数据库不能,它会导致间歇性的性能问题,有些非常糟糕。这绝不是 Redis 独有的。

    对于您的应用程序,特别是如果它是 JAVA,请设置真正的 HugePages 并将透明的品种排除在外。如果这样做,请确保为应用程序和 redis 正确分配内存。虽然我不得不说,但我可能不建议在同一个实例/服务器/虚拟机上同时运行应用程序和 redis。

    【讨论】:

    • 好吧,确切地说,我有一个 Django (Python) 应用程序,尽管我认为这不会改变你的答案,对吗?
    • 不,不会。
    • 谢谢柯克!顺便说一句,为了进一步澄清,我需要 both echo never > /sys/kernel/mm/transparent_hugepage/enabledecho never > /sys/kernel/mm/transparent_hugepage/defrag,对吗?
    • 此外,根据您的经验,关闭 THP 是否会影响 req/s 吞吐量?
    • 您很可能需要这两个地方。您将需要某种在启动时启动的初始化脚本,每次都会执行此操作。
    【解决方案2】:

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

    transparent_hugepage=从不

    【讨论】:

    • 不知道为什么这个答案被否决了。这是另一个参考unix.stackexchange.com/a/99172/29023
    • 也许您不需要将其他答案称为“echo-games”,并在上面的链接中显示有关您想说的内容的更多详细信息
    • 抱歉,但当一个人无法将“transparent_hugepage=never”复制并粘贴到 Google 或不知道内核参数是什么时,他无论如何都不是观众
    • 简单。 OP 提出了许多问题,但没有这个答案解决了这些问题。
    • 我指的是“echo never > /sys/kernel”,它不是持久的,而“transparent_hugepage=never”作为 kenerl 参数是 a) 持久的和 b) 尽早设置
    【解决方案3】:

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

    如果您的 redis 实例具有(几乎)恒定的内存占用,您只能从 THP 中受益。同样适用于to java 或任何其他进行自己的内存管理的长期服务。预分配内存一次即可受益。

    【讨论】:

      【解决方案4】:

      关闭透明大页面是个坏主意,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 发行版中的默认设置。

      一些背景:

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

      【讨论】:

        【解决方案5】:

        搜索“透明大页面”会产生关于如何禁用它们的最佳结果,这是相当烦人的,因为 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 建议禁用它们的“透明大页面”的搜索结果。这个建议很糟糕。

        【讨论】:

          猜你喜欢
          • 2012-10-09
          • 2017-05-03
          • 2017-12-18
          • 2017-12-29
          • 2017-02-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-28
          相关资源
          最近更新 更多