我正在尝试通过无所事事的状态下的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
答案 0 :(得分:3)
基于此question,您可以安装软件包sysfs
,并使用template
或lineinfile
模块设置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
感谢大家的帮助!希望此解决方案适用于其他有相同问题的人。 :)