关闭transparent_hugepage

jimmy 2018年06月16日 3,590次浏览

centos 7 关闭 transparent_hugepage

请输入图片描述

背景

在centos7上面使用mongo链接服务器后会打印如下提示:

[server@middle ~]$ mongo --host 10.10.51.212:37001
MongoDB shell version v3.6.5
connecting to: mongodb://10.10.51.212:37001/
MongoDB server version: 3.6.5
Server has startup warnings: 
2018-06-15T22:14:53.756+0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is \'always\'.
2018-06-15T22:14:53.756+0800 I CONTROL  [initandlisten] **        We suggest setting it to \'never\'
2018-06-15T22:14:53.756+0800 I CONTROL  [initandlisten] 
2018-06-15T22:14:53.756+0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is \'always\'.
2018-06-15T22:14:53.756+0800 I CONTROL  [initandlisten] **        We suggest setting it to \'never\'

mongodb期望我们修改两个参数,否则可能会影响服务器的性能

transparent_hugepage 是什么

只有64位系统才有transparent_hugepage功能。

从rhel6开始系统将默认对所有程序开启transparent_hugepage(THP),linux内核将尽可能的尝试分配2M的页大小给程序使用,内核空间在内存中自身是2M对齐的,目的是减少内核TLB(现代CPU使用一小块关联内存,用来缓存最近访问的虚拟页的PTE。这块内存称为translation lookaside buffer)的压力,增大page大小自然会减少TLB大小。如果内存没有2M连续大小的空间可分配,内核会回退到分配4KB页的方案。THP页也是可以换出的,这是通过把2M的大页分割成4KB的普通页实现的。

内核通过增加一个khugepaged内核线程,来不停的寻找连续的足够大的尽量对其的内存区域来满足内存分配请求。这个线程会偶尔尝试使用大的内存分配来替换连续的小内存页以最大化THP 的使用。

数据库应用不建议开启Transparent HugePages

ORACLE和mongodb数据库不建议开启THP,THP在运行时动态分配内存,可能会带来运行时内存分配的延误。

关闭Transparent HugePages

查询系统是否开启了THP命令

[root@middle ~]# cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never
[root@middle ~]# cat /sys/kernel/mm/transparent_hugepage/defrag
[always] madvise never

如果括号中的是always表示开启了,never则表示为开启

方案1

在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

或者新建一个service

[root@middle ~]# vi /etc/systemd/system/disable-thp.service

[Unit]
Description=Disable Transparent Huge Pages (THP)

[Service]
Type=simple
ExecStart=/bin/sh -c "echo \'never\' > /sys/kernel/mm/transparent_hugepage/enabled && echo \'never\' > /sys/kernel/mm/transparent_hugepage/defrag"

[Install]
WantedBy=multi-user.target


[root@middle ~]#systemctl daemon-reload

使生效
[root@middle ~]#systemctl start disable-thp
开机即生效
[root@middle ~]#systemctl enable disable-thp

方案2

通过修改grub启动参数来实现

[root@middle ~]# cat /etc/default/grub  
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed \'s, release .*$,,g\' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet"
GRUB_DISABLE_RECOVERY="true"

将 GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet" 这一行修改为

GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet transparent_hugepage=never"

并执行

[root@middle ~]# grub2-mkconfig -o /boot/grub2/grub.cfg

方案3

以上两个方案不是能实时生效,需要重启系统。如果需要实时生效需要

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