16.04如何修改"/sys/kernel/mm/transparent_hugepage/enabled"

分享于 

8分钟阅读

ubuntu

  繁體

问题

我使用mongodb 3.0,得到一个警告:


MongoDB shell version: 3.0.0


connecting to: test


Server has startup warnings: 


2015-03-13T16:28:29.405+0800 I CONTROL [initandlisten] 


2015-03-13T16:28:29.406+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.


2015-03-13T16:28:29.406+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never'


2015-03-13T16:28:29.406+0800 I CONTROL [initandlisten] 


2015-03-13T16:28:29.407+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.


2015-03-13T16:28:29.407+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never'


2015-03-13T16:28:29.407+0800 I CONTROL [initandlisten]




~# cat /sys/kernel/mm/transparent_hugepage/enabled


[always] madvise never



~# cat /sys/kernel/mm/transparent_hugepage/defrag


[always] madvise never



我尝试使用echo,但是它不是永久的,重新启动后将被重置。


echo never > /sys/kernel/mm/transparent_hugepage/defrag



如何永久修改/sys/kernel/mm/transparent_hugepage/enabled


答案1

安装sysfsutils软件包:


sudo apt install sysfsutils



并将有该设置的行附加到/etc/sysfs.conf


kernel/mm/transparent_hugepage/enabled = never



这是最干净的解决方案,因为它将所有sysfs配置保存在一个位置,而不是依赖自定义启动脚本。


答案2

MongoDB文档有一些建议,http://docs.mongodb.org/manual/reference/transparent-huge-pages/

"首选"方法是编辑/etc/default/grub,并将transparent_hugepage=never附加到GRUB。


sed -r 's/GRUB_CMDLINE_LINUX_DEFAULT="[a-zA-Z0-9_= ]*/& transparent_hugepage=never/' /etc/default/grub | sudo tee /etc/default/grub


sudo update-grub



请注意,update-grubgrub-mkconfig的包装,grub-mkconfig将把/etc/default/grub中的条目与/etc/default/grub.d/*中的条目匹配,如果在AWS上运行,你需要编辑/etc/default/grub.d/50-cloudimg-settings.cfg

"候选"方法是编辑/etc/rc.local并在exit 0之前添加以下内容:


if test -f /sys/kernel/mm/transparent_hugepage/khugepaged/defrag; then


 echo 0 > /sys/kernel/mm/transparent_hugepage/khugepaged/defrag


fi


if test -f /sys/kernel/mm/transparent_hugepage/defrag; then


 echo never > /sys/kernel/mm/transparent_hugepage/defrag


fi


if test -f /sys/kernel/mm/transparent_hugepage/enabled; then


 echo never > /sys/kernel/mm/transparent_hugepage/enabled


fi



*在Ubuntu 14.04,MongoDB 3.0.2和AWS上正常工作。


答案3

下面是一个已经测试过的解决方案,可以在AWS ec Ubuntu 16.04上使用,Ubuntu 16.04使用systemd init系统,这个配置文件表示这些设置应该在MongoDB启动之前更改。

创建/etc/systemd/system/mongodb-hugepage-fix.service 并添加以下内容:


[Unit]


Description="Disable Transparent Hugepage before MongoDB boots"


#WARN: check service name on your system


# If you are using MongoDB Cloud, service name is"mongodb-mms-automation-agent.service"


Before=mongodb.service 



[Service]


Type=oneshot


ExecStart=/bin/bash -c 'echo never > /sys/kernel/mm/transparent_hugepage/enabled'


ExecStart=/bin/bash -c 'echo never > /sys/kernel/mm/transparent_hugepage/defrag'



[Install]


#WARN: check service name on your system


# If you are using MongoDB Cloud, service name is"mongodb-mms-automation-agent.service"


RequiredBy=mongodb.service



将文件加载到systemd:


systemctl daemon-reload



以启动时间依赖MongoDB来激活文件


systemctl enable mongodb-hugepage-fix



如果要立即激活更改(在下一次引导之前)


systemctl start mongodb-hugepage-fix


systemctl restart mongod



这个解决方案不适合Ubuntu 14.04,它使用Upstart init解决方案,而不是systemd。


答案4

将以下行追加到/etc/rc.local。


if test -f /sys/kernel/mm/transparent_hugepage/enabled; then


 echo never > /sys/kernel/mm/transparent_hugepage/enabled


fi



if test -f /sys/kernel/mm/transparent_hugepage/defrag; then


 echo never > /sys/kernel/mm/transparent_hugepage/defrag


fi



这将在重新启动服务器时运行。


答案5

因为使用Ansible部署机器,我不喜欢修改rc文件。

有时有用,有时没有。

由于mongod是一个upstart进程,我发现最干净的解决方案是添加文件/etc/mongo_vm_settings.conf,包含以下内容:


# Ubuntu upstart file at /etc/init/mongod_vm_settings.conf


#


# This file will set the correct kernel VM settings for MongoDB


# This file is maintained in Ansible



start on (starting mongod)


script


 echo"never" > /sys/kernel/mm/transparent_hugepage/enabled


 echo"never" > /sys/kernel/mm/transparent_hugepage/defrag


end script



这将在mongod启动之前运行脚本,重启mongo (sudo service mongod restart 完成)。


答案6

我在/etc/sysfs.conf yvoil中添加了这两行


kernel/mm/transparent_hugepage/enabled = never


kernel/mm/transparent_hugepage/defrag = never



应用这些更改后重新启动计算机。


答案7

GRUB将在升级后更改,rc.local只在mongo启动后运行,所以,应该在rc.local的末尾添加service mongo restart





if test -f /sys/kernel/mm/transparent_hugepage/enabled; then


 echo never > /sys/kernel/mm/transparent_hugepage/enabled


fi



if test -f /sys/kernel/mm/transparent_hugepage/defrag; then


 echo never > /sys/kernel/mm/transparent_hugepage/defrag


fi



wait 1 && servie mongod restart






MODI  
相关文章