以ansible角色禁用THP(透明大页面)

时间:2018-07-09 12:55:48

标签: ansible ansible-2.x

我正在尝试通过无所事事的状态下的ansable禁用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输出:

  

任务[Disable-THP:禁用THP支持(导致延迟和内存使用情况   redis问题)] ***更改:[127.0.0.1] => {“更改”:true,   “ cmd”:“从不回显> / sys / kernel / mm / transparent_hugepage / enabled”,   “ delta”:“ 0:00:00.003939”,“ end”:“ 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'作为根用户,并将其添加到   您的/etc/rc.local,以便在重新启动后保留设置。   禁用THP后,必须重新启动Redis。

我在ansible脚本中做错什么了吗,还是有人可以帮助我解决为什么这个简单的shell命令不起作用?

Br, 维克多

更新: 我稍微修改了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到VM并捕获已启用的文件时,它表明该值仍然是[always]

  

任务[Disable-THP:禁用THP支持(导致延迟和内存使用情况   redis问题)] ***更改:[127.0.0.1] => {“更改”:true,   “ cmd”:“回显\”从不“ >>   / sys /内核/ mm / transparent_hugepage /已启用\ 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 [never]“]}

为什么文件的内容表明它已被更改,但是然后当我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

4 个答案:

答案 0 :(得分:3)

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

当然,包的名称可能会因您的分布而异。

您需要重新引导目标以考虑更改。

答案 1 :(得分:2)

好吧,因此,根据投票最多的答案,这两个答案均与实际的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

答案 2 :(得分:1)

@clopez:sysfsutils不在centOS中创建/etc/sysfs.conf。每次运行剧本时,“ 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 :(得分:0)

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

- 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

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