在RHEL6中,透明大页功能是默认开启的。

开启该选项后,内核会尽可能地尝试分配大页,如果mmap区域是2mb,那么每个linux进程都会分配到2mb大小的页。如果大页不够用了(比如物理内存不够了),内核会重新分配4KB大小的页。透明大页是可以交换的(swappable),通过将大页转换成小的4KB的页。

为了有效的使用大页,内核必须找到连续可用的物理内存来进行分配。为此增加了一个内核线程。透明大页和大页类似:但是透明大页是运行时由内核线程khugepaged自动创建的;大页必须在启动前预先分配。

ORACLE建议关闭透明大页的功能:透明大页会导致节点不可预料的重启,以及RAC的性能问题;透明大页也会导致单节点数据库环境发生不可预料的性能问题或延迟。

比如RAC节点发生重启后,可能会在ocssd.log中发现以下日志信息:

2013-05-01 14:30:45.255: [    CSSD][224204544]clssscMonitorThreads clssnmvKillBlockThread not scheduled for 7500 msecs
2013-05-01 14:30:46.945: [    CSSD][224204544]clssscMonitorThreads clssnmvWorkerThread not scheduled for 8030 msecs 

 

Mongodb环境也建议关闭透明大页功能。

 

检查是否开启了透明大页功能:

RHEL系统:

# cat /sys/kernel/mm/redhat_transparent_hugepage/enabled
[always] never

其他系统:(如果是UEK2内核,2.6.39-400.116.0没有将透明大页编译进去,这个文件就不存在)

# cat /sys/kernel/mm/transparent_hugepage/enabled
[always] never

[always]表示启用
[never]表示禁用

 

因为内核只是对匿名内存块,比如stack、heap使用透明大页,/proc/meminfo中的AnonHugePages也表示内核使用了多少透明大页内存:

# grep AnonHugePages /proc/meminfo 
AnonHugePages:  20142080 kB

 

禁用透明大页的方法:
1.修改文件/etc/grub.conf,添加一行:

transparent_hugepage=never

2.修改文件/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