标签归档:Redhat

禁用 Transparent Huge Pages (THP) 透明巨大页面

Transparent Huge Pages (THP)是一种Linux内存管理系统,可以通过使用更大的内存页来减少对带有大量内存的机器Translation Lookaside Buffer (TLB)的开销。

然而,数据库工作负载通常在THP上表现不佳,因为它们往往是稀疏而非连续性的内存访问模式。所以你应该禁用Linux机器上的THP,以确保Redis、ORACLE、MariaDB、MongoDB等数据库的最佳性能。

Transparent Huge Pages是在CentOS/RedHat 6.0中引入的优化,从CentOS 7 版本开始,该特性默认启用,其目的是减少大量内存的系统的开销。然而,由于某些数据库使用内存的方式,这个特性实际上弊大于利,因为内存访问很少是连续的。

下面介绍如何禁用RedHat/CentOS 6/7上的透明巨大页面。对于其他系统,请查阅供应商的文档。

生产环境:

$ hostnamectl
...
Operating System: CentOS Linux 7 (Core)
CPE OS Name: cpe:/o:centos:centos:7.4 1708
Kernel: Linux 3.10.0-693.2.2.el7.x86_64
Architecture: x86-64

先查看 THP 状态:

$ cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never

$ cat /sys/kernel/mm/transparent_hugepage/defrag
[always] madvise never

状态显示:启用。

创建脚本:

$ vim /etc/init.d/disable-transparent-hugepages

添加以下内容:

#!/bin/bash
### BEGIN INIT INFO
# Provides:          disable-transparent-hugepages
# Required-Start:    $local_fs
# Required-Stop:
# X-Start-Before:    mongod mongodb-mms-automation-agent
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Disable Linux transparent huge pages
# Description:       Disable Linux transparent huge pages, to improve
#                    database performance.
### END INIT INFO

case $1 in
  start)
    if [ -d /sys/kernel/mm/transparent_hugepage ]; then
      thp_path=/sys/kernel/mm/transparent_hugepage
    elif [ -d /sys/kernel/mm/redhat_transparent_hugepage ]; then
      thp_path=/sys/kernel/mm/redhat_transparent_hugepage
    else
      return 0
    fi

    echo 'never' > ${thp_path}/enabled
    echo 'never' > ${thp_path}/defrag

    re='^[0-1]+$'
    if [[ $(cat ${thp_path}/khugepaged/defrag) =~ $re ]]
    then
      # RHEL 7
      echo 0  > ${thp_path}/khugepaged/defrag
    else
      # RHEL 6
      echo 'no' > ${thp_path}/khugepaged/defrag
    fi

    unset re
    unset thp_path
    ;;
esac

保存并退出!

给予该文件可执行权限,命令如下:

$ chmod 755 /etc/init.d/disable-transparent-hugepages

加入开机自启动并重启系统:

$ systemctl enable disable-transparent-hugepages
$ systemctl start disable-transparent-hugepages
$ sudo reboot

再次查看THP状态:

$ cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]

$ cat /sys/kernel/mm/transparent_hugepage/defrag
always madvise [never]

状态显示:已经禁用。

到此 禁用 Transparent Huge Pages 的目的已经实现。

注意:该教程不适用于Debian/Ubuntu或CentOS/RedHat 5 及更低版本。原因上述已说明。

Linux CentOS 7 重置root用户密码

在Centos 7以前的发行版中,只需要在vmlinuz行末尾添加“1”或“single”后按b重新引导即可。Linux Centos 7系列发行版系统,若是忘记超级用户root密码,破解起来相当费事。而且重置Centos 7 Root密码的方法和Centos 6系列完全不同。

接下来我将以2种解决方案破解Centos 7 Root密码。

第一种解决方案

1.进入单用户模式

在系统启动读秒的时候,按下任意键,会出现选择内核启动项,选择第一个按下e编辑当前内核。

在以下选项中,添加“rd.break”红色标注部分:

linux16 /vmlinuz-3.10.0-514.el7.x86_64 root=/dev/mapper/cl-root ro cra\
shkernel=auto rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet LANG=en_US.UTF-8 rd.break

添加完成,然后按 “ctrl+x” 或 “F10” 启动。

2.以读写权限挂载文件系统

switch_root # mount -o rw,remount /sysroot/
switch_root # chroot /sysroot/

3.修改root用户密码

sh-4.2 # echo NewRenwole123 | passwd --stdin root
Changing password for user root.
passwd:all authentication tokens updated successfully.

或:

sh-4.2 # passwd root (输入两次密码回车即可)

4.重载SElinux并退出单用户模式

sh-4.2 # touch /.autorelabel
sh-4.2 # exit
switch_root # reboot

重新启动后,可以使用新密码 “NewRenwole123” 登录。

第二种解决方案

1.进入单用户模式

系统启动读秒的时候,按下e编辑当前内核:

linux16 /vmlinuz-3.10.0-514.el7.x86_64 root=/dev/mapper/cl-root ro cra\
shkernel=auto rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet LANG=en_US.UTF-8

修改为:

linux16 /vmlinuz-3.10.0-514.el7.x86_64 root=/dev/mapper/cl-root ro cra\
shkernel=auto rd.lvm.lv=cl/root rd.lvm.lv=cl/swap init=/bin/sh

将“rhgb quiet LANG=zh_CN.UTF-8”替换为“init=/bin/sh”,按“ctrl+x”或“F10”引导系统。

2.挂载并使文件系统为可写

sh-4.2 # mount -o remount,rw /
sh-4.2 # passwd root (回车后需输入两次密码,成功后出现如下提示):
passwd:all authentication tokens updated successfully.

3.加载 SELinux 策略,并重启系统

sh-4.2 # touch /.autorelabel
sh-4.2 # exec /sbin/init

系统初始化完毕后会自动重启,用新密码登录即可。