【问题标题】:Disabling THP (Transparent hugepages) with ansible role使用 ansible 角色禁用 THP(透明大页)
【发布时间】:2018-07-09 12:55:48
【问题描述】:

我正在尝试通过 ansible on vagrant up 禁用 THP,因为它会干扰 Redis(如果启用,则会导致延迟和使用 redis 的内存问题) 禁用 THP 的命令是 "echo never > /sys/kernel/mm/transparent_hugepage/enabled" 但它似乎不适用于简单的 shell 角色,如下所示。

- name: Disable THP support (causes latency and mem usage issues with redis)
  shell: echo never {{ ">" }} /sys/kernel/mm/transparent_hugepage/enabled
  become: yes
  become_method: sudo
  become_user: root

这是ansible的输出:

TASK [Disable-THP : 禁用 THP 支持(导致延迟和内存使用) redis 的问题)] *** 更改:[127.0.0.1] => {"changed": true, "cmd": "echo never > /sys/kernel/mm/transparent_hugepage/enabled", “增量”:“0:00:00.003939”,“结束”:“2018-07-09 12:22:33.183451”,“rc”: 0,“开始”:“2018-07-09 12:22:33.179512”,“stderr”:“”, “stderr_lines”:[],“stdout”:“”,“stdout_lines”:[]}

之后我 ssh 进入虚拟机并启动 redis-server,它仍然给我警告信息。

警告您已启用透明大页面 (THP) 支持 核心。这将在 Redis 中产生延迟和内存使用问题。 要解决此问题,请运行命令 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' 作为 root,并将其添加到 您的 /etc/rc.local 以便在重新启动后保留设置。 禁用 THP 后必须重新启动 Redis。

我是否对 ansible 脚本做错了什么,或者任何人都可以帮助我了解为什么这个简单的 shell 命令不起作用?

兄弟, 维克多

更新: 我稍微修改了我的 ansible 角色,以检查文件的内容是否真的发生了变化。角色现在看起来像这样:

- name: Disable THP support (causes latency and mem usage issues with redis)
  shell: |
    echo "never" >> /sys/kernel/mm/transparent_hugepage/enabled
    cat /sys/kernel/mm/transparent_hugepage/enabled
  become: true
  become_user: root
  become_method: sudo

根据输出,启用的文件实际上将值更改为 [never]。但是当我 ssh 进入虚拟机并 cat 启用的文件时,它显示该值仍然是 [always]

TASK [Disable-THP : 禁用 THP 支持(导致延迟和内存使用) redis 的问题)] *** 更改:[127.0.0.1] => {"changed": true, "cmd": "回显\"从不\" >> /sys/kernel/mm/transparent_hugepage/enabled\n cat /sys/kernel/mm/transparent_hugepage/enabled", "delta": “0:00:00.005309”,“结束”:“2018-07-10 10:41:27.801697”,“rc”:0, “开始”:“2018-07-10 10:41:27.796388”,“stderr”:“”,“stderr_lines”: [],“stdout”:“总是疯狂 [never]”,“stdout_lines”:[“总是 madvise [从不]"]}

为什么文件的内容显示它已更改,但是当我 SSH 进入 VM 时,它似乎告诉我不是这样?

[vagrant@test ~]$ cd ..
[vagrant@test home]$ cd ..
[vagrant@test /]$ cd sys/kernel/mm/transparent_hugepage/
[vagrant@test transparent_hugepage]$ cat enabled
[always] madvise never

【问题讨论】:

  • 文件内容有变化吗?如果是,您的问题与 Ansible 有什么关系?如果没有,您做了什么来排除故障,为什么不在问题中?
  • 我编辑了我的原始帖子以尝试回答您的问题,希望对您有所帮助。我对 ansible 很陌生,如果一开始不清楚,很抱歉。
  • 还有一种方法可以“间接”禁用它。通过调谐。例如,Oracle 通过用于调整的专用配置文件禁用它。 access.redhat.com/solutions/2867881

标签: ansible ansible-2.x


【解决方案1】:

基于此question,您可以安装包sysfs,并使用templatelineinfile 模块设置sysfs.conf 文件的配置。它具有幂等性的优点。

---
- hosts: target
  become: yes
  tasks:
    - package:
        name: sysfsutils
    - lineinfile:
        path: /etc/sysfs.conf
        line: kernel/mm/transparent_hugepage/enabled = never

当然,软件包名称可能因您的发行版而异。

您需要重新启动目标才能将更改考虑在内。

【讨论】:

  • 非常感谢!这似乎是一个聪明的方法,我会在尝试后立即向您报告!
  • 这只会更新“sysfs.conf”,但在下次重启之前不会激活更改,对吧?
【解决方案2】:

@clopez: sysfsutils 不会在 centOS 中创建 /etc/sysfs.conf。每次运行 playbook 时,您的 'lineinfile' conf 也会添加相同的行。

这是我的配置 - 也适用于基于 debian 的系统:

    - name: install sysfsutils for disabling transparent huge pages
      package:
        name: sysfsutils
        state: latest
    - name: disable transparent huge pages for redis performance - persistent change
      lineinfile:
        path: /etc/sysfs.conf
        create: true
        regexp: '^kernel\/mm\/transparent\_hugepage\/enabled'
        line: "kernel/mm/transparent_hugepage/enabled = never"
    - name: disable transparent huge pages for redis performance - live change
      shell: echo never {{ ">" }} /sys/kernel/mm/transparent_hugepage/enabled

【讨论】:

  • 更改后是否仍需要重新启动?
【解决方案3】:

好的,根据投票最多的答案,这会将两个答案与实际的 Ansible 任务结合起来:

- name: Install sysfsutils for disabling transparent huge pages
  become: yes
  apt:
    name: sysfsutils
    state: latest

- name: Disable transparent huge pages for performance
  become: yes
  lineinfile:
    path: /etc/sysfs.conf
    line: |
      kernel/mm/transparent_hugepage/enabled = never

【讨论】:

    【解决方案4】:

    好的,问题显然是我的 /etc/rc.local 文件没有适当的权限在启动时运行。我为这个任务添加了一个 ansible 角色:

    - name: Change permissions of /etc/rc.local to make it run on boot
      shell: chmod +x /etc/rc.d/rc.local
      become_method: sudo
    

    这使得 /etc/rc.local 文件在启动时运行,这为我解决了这个问题。现在我从内核设置中删除 THP 的整个任务看起来像这样。

    - name: Disable THP support scripts added to rc.local
      lineinfile:
        path: /etc/rc.local
        line: |
          echo never > /sys/kernel/mm/transparent_hugepage/enabled
          echo never > /sys/kernel/mm/transparent_hugepage/defrag
    
    - name: Change permissions of /etc/rc.local to make it run on boot
      shell: chmod +x /etc/rc.d/rc.local
      become_method: sudo
    

    感谢大家的帮助!!希望这个解决方案适用于其他有同样问题的人。 :)

    【讨论】:

    • 老实说,在/etc/rc.d/rc.local 中添加一些参数是我现在建议做的最后一件事(90 年代曾经是这种情况)。在现代 Linux 领域,有将参数放入 sysfs 的基础设施。
    • lineinfile 是放1行,用2行会使其非幂等,加上每次都会加2行
    猜你喜欢
    • 1970-01-01
    • 2017-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-29
    • 1970-01-01
    • 2013-05-19
    • 1970-01-01
    相关资源
    最近更新 更多