我的问题
我在删除有关OVH CentOS 7安装上的透明巨大页面(THP)的MongoDB警告时遇到了问题,而且问题似乎是无法以root身份写入/sys/kernel/mm
。
首先,我意识到OVH内核是定制的,而且我知道很多人会说要使用一个新的非定制的内核,但现在这不是一个选项。 我需要为当前的操作系统解决这个问题。
MongoDB警告:
2016-03-09T00:31:45.889-0500 W CONTROL [initandlisten] Failed to probe "/sys/kernel/mm/transparent_hugepage": Permission denied 2016-03-09T00:31:45.889-0500 W CONTROL [initandlisten] Failed to probe "/sys/kernel/mm/transparent_hugepage": Permission denied
MongoDB正试图读取transparent_hugepage文件(下面),但它们不存在:
/sys/kernel/mm/transparent_hugepage/enabled /sys/kernel/mm/transparent_hugepage/defrag
无法创build文件
我所见过的所有解决scheme都涉及到创build文件并never
填充文件,包括MongoDB文档中的脚本 。 在所有的解决scheme中,这是关键部分:
echo never > /sys/kernel/mm/transparent_hugepage/enabled echo never > /sys/kernel/mm/transparent_hugepage/defrag
但是,这些文件不存在,我不能以root身份在/sys/kernel/mm
下创build任何东西。
root@myhost [~]# echo never > /sys/kernel/mm/transparent_hugepage/enabled -bash: /sys/kernel/mm/transparent_hugepage/enabled: No such file or directory root@myhost [~]# mkdir -p /sys/kernel/mm/transparent_hugepage mkdir: cannot create directory '/sys/kernel/mm/transparent_hugepage': Operation not permitted
目录/sys/kernel/mm
的所有者和组是root
,并且我已经临时将权限从700更改为777,但是我仍然不能以root身份创build目录。
调谐configuration文件也没有帮助
为了彻底,我还创build了自定义的Tunedconfiguration文件(按照上面的MongoDB链接中的说明)并激活它,但是它会生成错误WARNING tuned.plugins.plugin_vm: Option 'transparent_hugepages' is not supported on current hardware.
调谐configuration文件(/etc/tuned/no-thp/tuned.conf):
[main] include=virtual-guest [vm] transparent_hugepages=never
调谐日志中的错误:
WARNING tuned.plugins.plugin_vm: Option 'transparent_hugepages' is not supported on current hardware.
MongoDB本身的一些解决scheme?
看来最好的解决办法是以某种方式明确configurationMongoDB不使用THP,以便它不必检查丢失的文件,但我没有看到这样的东西。 如果有办法,即使涉及到定制MongoDB(并在每次更新之后重复),我也愿意这样做。
现在我已经在OVH上安装了CentOS 7。 他们使用/boot/bzImage-3.14.32-xxxx-grs-ipv6-64
实现grsecurity
( https://grsecurity.net ),它阻止了一些文件夹的访问。
MongoDB关于巨大页面的警告的非常简单的解决方案可以通过替换内核来解决。 CentOS7的程序如下:
/boot
文件夹中。 编辑/etc/grub2.cfg
:
#linux /boot/bzImage-3.14.32-xxxx-grs-ipv6-64 root = / dev / md1 ro net.ifnames = 0
linux /boot/bzImage-4.8.17-xxxx-std-ipv6-64 root = / dev / md1 ro net.ifnames = 0
在这里,我用bzImage-3.14.32-xxxx-grs-ipv6-64
替换了bzImage-3.14.32-xxxx-grs-ipv6-64
grs
。
现在,重新启动并检查新内核是否正常:
root@ns506846 ~]# uname -r 4.8.17-xxxx-std-ipv6-64