闲聊

有一段时间,数据库上出现过CPU消耗非常高的问题。最后分析到了Linux HugePage,发现自己对这一块都没什么了解。于是做了 些了解。

Linux 下的大页分为两种类型:标准大页(Huge Pages) 和透明大页(Transparent Huge Pages). 这两种是不一样的。

  • Huge Pages 从Linux Kernel 2.6 后被引入。目的是使用更大的页面(memory page size) 以适应越来越大的系统内存,让操作系统可以支持 现代硬件架构的大而面容量功能。一般单个大页的空间大于4k.
  • Transparent Huge Pages 从RHEL 6 .SUSE Server 11,Oracle Linux(UEK2) 开始引入的一个功能。

而这两种大页, 根本的区别:Huge Page 是预分配的,Transparent Huge Pages 是动态分配的。

在两者一起使用的情况下,可能会导致性能问题和系统重启。Oracle 服务器建议禁用Transparent Huge Pages. 而在Oracle Linux 6.5 中,已经删除Transparent HugePages.

关键概念

2.1 Page Table

保存着虚拟内存地址与物理内存地址之间的对应关系。所以在一个拥有虚拟内存的系统中,要访问物理内存地址,需要先访问page table.

2.2 TLB

TLB: Translation Lookaside Buffer. CPU 中的buffer空间,里面存储着Page Table 的部分内容。这部分空间大小是固定的。

2.3 hugetlb

TLB 中指向大页的entry.

2.4 hugetlbfs

Linux从内核2.6开始,出现这种是驻内存(in-memory)文件系统,如tmpfs. 在这种文件系统中分配的内存页,都是大页。

HugePage的优点

  • 不可交换 内存使用率比较高时,会避免或者减少page in / out.
  • 减轻TLB压力 因每个页面指向的物理内存范围变大,所以需要较少的Page table entry 就可以管理较大的内存空间。这也为查询带来好处, 原来需要查询100个page table entry,可能只需要1个entry 就足够了。
  • 减少页表空间占用 每个page talbe entry 可达64 bytes. 在管理50G内存时,lowmem 中pagetable大小为近800M,而实际上880M 都不一定用,因为 还要考虑lowmem 的其他用途(这是kernel 2.4中的情况,在kernel 2.6中,pagetable不是必须的)。如果使用了大页, 每个大页假设为256M,page table 40M 足矣。

HugePages

4.1 查看

  • 查询标准大页的大小

    之前说过,huge page 的大小是提前设置好的。那么设置的大页大小是多少呢。可以通过/proc/meminfo来看。

    $grep Huge /proc/meminfoAnonHugePages:     18432 kB
    HugePages_Total:       0
    HugePages_Free:        0
    HugePages_Rsvd:        0
    HugePages_Surp:        0
    Hugepagesize:       2048 kB
    

    AnonHugePages: 匿名 HugePages 数量。Oracle Linux 6.5 中已删除此计数器。与透明 HugePages 有关。

    HugePages_Total: 分配的页面数目,和Hugepagesize相乘后得到所分配的内存大小

    HugePages_Free: 从来没有被使用过的Hugepages数目。即使oracle sga已经分配了这部分内存,但是如果没有实际写入,那么看到的还是Free的。这是很容易误解的地方(池中尚未分配的 HugePages 数量。)

    HugePages_Rsvd: 已经被分配预留但是还没有使用的page数目。在Oracle刚刚启动时,大部分内存应该都是Reserved并且Free的,随着ORACLE SGA的使用,Reserved和Free都会不断的降低

    HugePages_Surp: “surplus”的缩写形式,表示池中大于/proc/sys/vm/nr_hugepages 中值的 HugePages 数量。剩余 HugePages 的最大数量由 /proc/sys/vm/nr_overcommit_hugepages 控制。此值为0的情况很常见

    Hugepagesize: 页面大小

    HugePages_Free – HugePages_Rsvd 这部分是没有被使用到的内存,如果没有其他的oracle instance,这部分内存也许永远都不会被使用到,也就是被浪费了。

    HugePages_Total-HugePages_Free+HugePages_Rsvd 就是目前实例需要的页面数量.

  • 查看是否启用huge_page

    可以通过两个文件中的参数来确定,系统是否启用了大页。

    $ cat /proc/sys/vm/nr_hugepages
    0
    $ grep -i HugePages_Total /proc/meminfo
    HugePages_Total:       0
    

    如果两个的结果都是0 ,说明系统中已禁用大页,而且不存在内存大页

4.2 设置hugepage 大小

设置大页大小,一般都是修改内核参数nr_hugepages。即在/etc/sysctl.conf配置文件中设置参数vm.nr_hugepages。设置好后,重启服务器生效。

echo "vm.nr_hugepages=512" >> /etc/sysctl.conf

针对Oracle 数据库设置内存大页大小,参照 计算oracle大页大小.

  • 查看是否启用

    $cat /proc/sys/vm/nr_hugepages0$ grep -i HugePages_Total /proc/meminfoHugePages_Total:     0
    

    HugePages_Total为0,说明hugepage没有使用。 nr_hugepages为0,意味着没有设置。

Transparent Huge Pages

5.1 查看是否启用

# 针对redhat/CentOS6
cat /sys/kernel/mm/redhat_transparent_hugepage/enabled
# 针对其他系统及CentOS7开始
cat /sys/kernel/mm/transparent_hugepage/enabledalways madvise [never]

使用命令查看时,如果输出结果为[always]表示透明大页启用了。[never]表示透明大页禁用、[madvise]表示(只在MADV_HUGEPAGE标志的VMA中使用THP

通过grub.conf/rc.local配置文件来控制大页是否随系统启动.

通过调整/sys/kernel/mm/redhat_transparent_hugepage/enabled 文件实时控制是否使用透明大页。

5.2 不启用透明大页

5.2.1 grub

通过grub 来控制透明大页,是根本上不启用透明大页这一功能。

  • CentOS 6

    /etc/grub.conf 是系统启动时参数文件,大页随系统启动或者停止 ,可以通过参数transparent_hugepage 来控制。 transparent_hugepage = never 表示透明大页功能不随系统启动 transparent_hugepage = always 表示透明大页功能随系统启动

    vi /etc/grub.conf# grub.conf generated by anaconda
    #
    # Note that you do not have to rerun grub after making changes to this file
    # NOTICE:  You have a /boot partition.  This means that
    #          all kernel and initrd paths are relative to /boot/, eg.
    #          root (hd0,0)
    #          kernel /vmlinuz-version ro root=/dev/mapper/VolGroup--LogVol0-LogVol01
    #          initrd /initrd-[generic-]version.img
    #boot=/dev/sdadefault=0
    timeout=5
    splashimage=(hd0,0)/grub/splash.xpm.gz
    hiddenmenu
    title Red Hat Enterprise Linux 6 (2.6.32-504.el6.x86_64)root (hd0,0)kernel /vmlinuz-2.6.32-504.el6.x86_64 ro root=/dev/mapper/VolGroup--LogVol0-LogVol01 rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=VolGroup-LogVol0/LogVol01 rd_LVM_LV=VolGroup-LogVol0/LogVol00  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quietinitrd /initramfs-2.6.32-504.el6.x86_64.img
    transparent_hugepage=never
    
  • CentOS7/CentOS8

    在这两个版本中,grub的位置发生了变化。变为 /etc/default/grub,我们只需要将 transparent_hugepage=never 添加到GRUB_CMDLINE_LINUX 这个变量里即可。示例如下:

    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 resume=/dev/mapper/cl-swap rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet transparent_hugepage=never"
    GRUB_DISABLE_RECOVERY="true"
    GRUB_ENABLE_BLSCFG=true
    

5.2.2 rc.local

通过rc.local 设置不启用,实际上是在开机的过程中先启用,然后再关闭。 下面是修改rc.local的脚本:

  • CentOS 6

    cat >> /etc/rc.local <<EOF
    if test -f /sys/kernel/mm/redhat_transparent_hugepage/enabled; then
    # 不使用echo never > /sys/kernel/mm/redhat_transparent_hugepage/enabled
    # 使用
    #  echo always > /sys/kernel/mm/redhat_transparent_hugepage/enabled
    fi
    EOF
    
  • CentOS7-8

    cat >> /etc/rc.local <<EOF
    if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
    # 不使用echo never > /sys/kernel/mm/transparent_hugepage/enabled
    # 使用
    #  echo always > /sys/kernel/mm/transparent_hugepage/enabled
    fi
    EOF
    

其实这个脚本,只是将临时关闭透明大页的方法以脚本的方式保存,使系统启动时运行脚本,达到不使用透明在页的目的。

5.3 临时调整

具体方法参见临时关闭透明大页. 调整完,查看实际是否仍在使用:

[root@halberd1 ~]# grep HugePages_Total /proc/meminfo
HugePages_Total:       0

值为0说明没有使用大页。

学习地址:Dpdk/网络协议栈/vpp/OvS/DDos/NFV/虚拟化/高性能专家(免费订阅,永久学习)

【文章福利】需要更多DPDK/SPDK学习资料加群793599096(资料包括C/C++,Linux,golang技术,内核,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,大厂面试题 等)可以自行添加学习交流群点击这里噢~

大页与Oracle

由于Oracle 不建议使用透明大页,那么针对Oracle 若启用大页,则只能使用预留HugePages。 在Oralce 服务器上开启预留HugePages,需要以下几个操作:

  1. 设置内核参数memlock

    memlock 用于限制用户最大锁定内存空间的大小,单位为KB。如果服务器只给Oracle 使用,那么这个参数的 值略小于物理内存即可。

    # grep memlock /etc/security/limits.conf*    soft    memlock    16384000
    *    hard    memlock    16384000
    
  2. 验证Oracle用户的memlock值

    su - oracle
    ulimit -l
    

    memlock是允许锁定的内存空间。一般设置成与物理内存等同。

  3. Oracle数据库禁用AMM

    10G 版本Oracle 数据库可忽略此步骤。因为10G 版本中不存在此功能。

    11G 版本Oracle 数据库需要禁用AMM.

    11G 之后默认创建的实例会使用Automatic Memory Management (AMM)的特性,该特性与HugePage不兼容。

    使用AMM的情况下,所有的SGA 内存都是在/dev/shm 下分配的,因此在分配SGA时不会使用HugePage。这也是AMM 与HugePage不兼容的原因。 默认情况下ASM instance 也是使用AMM的,但因为ASM 实例不需要大SGA,所以对ASM 实例使用HugePages意义不大。

    禁用命令如下:

    alter system set memory_target=0 scope=both;
    alter system set memory_max_target=0 scope=spfile;
    

    修改后,重启数据库生效。

  4. 计算合适的大页数量

    数据库所有实例都启动后,运行hugepages_settings.sh(具体参考Mos文档Document 401749.1)以计算出合适的大页数量。

    #!/bin/bash
    #
    # hugepages_settings.sh
    #
    # Linux bash script to compute values for the
    # recommended HugePages/HugeTLB configuration
    # on Oracle Linux
    #
    # Note: This script does calculation for all shared memory
    # segments available when the script is run, no matter it
    # is an Oracle RDBMS shared memory segment or not.
    #
    # This script is provided by Doc ID 401749.1 from My Oracle Support
    # http://support.oracle.com# Welcome text
    echo "
    This script is provided by Doc ID 401749.1 from My Oracle Support
    (http://support.oracle.com) where it is intended to compute values for
    the recommended HugePages/HugeTLB configuration for the current shared
    memory segments on Oracle Linux. Before proceeding with the execution please note following:* For ASM instance, it needs to configure ASMM instead of AMM.* The 'pga_aggregate_target' is outside the SGA andyou should accommodate this while calculating the overall size.* In case you changes the DB SGA size,as the new SGA will not fit in the previous HugePages configuration,it had better disable the whole HugePages,start the DB with new SGA size and run the script again.
    And make sure that:* Oracle Database instance(s) are up and running* Oracle Database 11g Automatic Memory Management (AMM) is not setup(See Doc ID 749851.1)* The shared memory segments can be listed by command:# ipcs -mPress Enter to proceed..."read# Check for the kernel version
    KERN=`uname -r | awk -F. '{ printf("%d.%d\n",$1,$2); }'`# Find out the HugePage size
    HPG_SZ=`grep Hugepagesize /proc/meminfo | awk '{print $2}'`
    if [ -z "$HPG_SZ" ];thenecho "The hugepages may not be supported in the system where the script is being executed."exit 1
    fi# Initialize the counter
    NUM_PG=0# Cumulative number of pages required to handle the running shared memory segments
    for SEG_BYTES in `ipcs -m | cut -c44-300 | awk '{print $1}' | grep "[0-9][0-9]*"`
    doMIN_PG=`echo "$SEG_BYTES/($HPG_SZ*1024)" | bc -q`if [ $MIN_PG -gt 0 ]; thenNUM_PG=`echo "$NUM_PG+$MIN_PG+1" | bc -q`fi
    doneRES_BYTES=`echo "$NUM_PG * $HPG_SZ * 1024" | bc -q`# An SGA less than 100MB does not make sense
    # Bail out if that is the case
    if [ $RES_BYTES -lt 100000000 ]; thenecho "***********"echo "** ERROR **"echo "***********"echo "Sorry! There are not enough total of shared memory segments allocated for
    HugePages configuration. HugePages can only be used for shared memory segments
    that you can list by command:# ipcs -mof a size that can match an Oracle Database SGA. Please make sure that:* Oracle Database instance is up and running* Oracle Database 11g Automatic Memory Management (AMM) is not configured"exit 1
    fi# Finish with results
    case $KERN in'2.4') HUGETLB_POOL=`echo "$NUM_PG*$HPG_SZ/1024" | bc -q`;echo "Recommended setting: vm.hugetlb_pool = $HUGETLB_POOL" ;;'2.6') echo "Recommended setting: vm.nr_hugepages = $NUM_PG" ;;'3.8') echo "Recommended setting: vm.nr_hugepages = $NUM_PG" ;;'3.10') echo "Recommended setting: vm.nr_hugepages = $NUM_PG" ;;'4.1') echo "Recommended setting: vm.nr_hugepages = $NUM_PG" ;;'4.14') echo "Recommended setting: vm.nr_hugepages = $NUM_PG" ;;*) echo "Kernel version $KERN is not supported by this script (yet). Exiting." ;;
    esac

学习地址:Dpdk/网络协议栈/vpp/OvS/DDos/NFV/虚拟化/高性能专家(免费订阅,永久学习)

【文章福利】需要更多DPDK/SPDK学习资料加群793599096(资料包括C/C++,Linux,golang技术,内核,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,大厂面试题 等)可以自行添加学习交流群点击这里噢~

示例:

For 2.4 kernel systems:
$ ./hugepages_settings.sh
...
Recommended setting: vm.hugetlb_pool = 764For 2.6 and later kernel systems:
$ ./hugepages_settings.sh
...
Recommended setting: vm.nr_hugepages = 67
  1. 修改/etc/sysctl.conf

    echo "vm.nr_hugepages = 4098" >> /etc/sysctl.conf
    
  2. 重启数据库
  3. 检查大页使用情况

    grep -i huge /proc/meminfo
    

转自https://www.cnblogs.com/halberd-lee/p/12802918.html

Linux HugePage相关推荐

  1. oracle linux hugepage,LInux下为什么配置HugePages及配置步骤

    一. HugePages 说明 1.1 HugePages 介绍 HugePages is afeature integrated into the Linux kernel with release ...

  2. Linux hugepage如何配置和使用

    为什么要使用hugepage hugepage也就是所谓的大页,为什么要使用它,自然是有它的一些优势,比如它所占用的page table entry较少,从而提高了页面查找的效率,tlb命中率也更高. ...

  3. 32位oracle_Oracle 之Hugepage

    1. Hugepage基本概念 系统进程是通过虚拟地址访问内存,但是CPU必须把它转换成物理内存地址才能真正访问内存. 为了提高这个转换效率,CPU会缓存最近的"虚拟内存地址和物理内存地址& ...

  4. Linux基础shell编程-琐碎知识点

    shell 脚本学习-网络野路子 shell脚本攻略 Linux命令大全(手册)_Linux常用命令行实例详解_Linux命令学习手册 Unix 基础知识 shell知识点_亦乐-可乐的博客-CSDN ...

  5. 加速度传感器 mag_将电话连接到没有辅助扬声器mag的汽车立体声

    加速度传感器 mag If you want to connect your mobile phone to car stereo without using Aux cable, then you ...

  6. python3文件处理_简述 Python3 文件处理

    1.文件处理 找到文件 --> 打开文件 --> 操作:读.写 --> 保存 --> 关闭 1.1.1 写文件 (只要牵扯到文件操作,都是字符串:写文件的时候需要把写的数字转换 ...

  7. dpdk代码分析——内存初始化

    一. 前言 dpdk 是 intel 开发的x86芯片上用于高性能网络处理的基础库,业内比较常用的模式是linux-app模式,即利用该基础库,在用户层空间做数据包处理,有了这个基础库,可以方便地在写 ...

  8. Linux 调优篇:虚拟化调优(hugepage 大页内存)* 叁

    一. 大页(HugePages)概念     Hugepage的引入 二. hugepages相关概念 三.Regular Pages 与 HugePages     a.Regular Pages ...

  9. Linux之hugepage大页内存理论

    目录 1.Hugepage的引入 二.hugepages相关概念 三.Regular Pages 与 HugePages a.Regular Pages b.Huge Pages 四. hugepag ...

最新文章

  1. 基本系统部署完成!北斗三号闪耀中国智慧
  2. 统计学习方法笔记(五)-线性可分支持向量机原理及python实现
  3. vsftpd 默认配置文件
  4. 创建基于AJAX技术的Scribble应用程序
  5. 腾讯云短信服务使用记录与.NET Core C#代码分享
  6. U-Boot-2009-03移植笔记(移植准备)
  7. 微服务 注册中心的作用_102,谈谈微服务注册中心zookeeperamp;Eureka
  8. 5-1 可维护性的度量和构造原则
  9. 数据结构|-二叉查找树(二叉搜索树)的链式存储结构的实现
  10. JQ实现单击按钮 倒计时获取验证码
  11. 系统学习机器学习之非参数方法
  12. python日常练习五,PPT批量转化pdf,批量把Word存入excel
  13. 分享免费下载论文的网站
  14. 微信语音红包小程序开发如何提高精准度 红包小程序语音识别精准度 微信小程序红包开发语音红包...
  15. 一次局域网入侵全过程
  16. 2022年各行业白皮书市场研报合集(共125份)
  17. CKA 认证考试必过技巧分享
  18. ubuntu更新后显卡驱动失效解决方案
  19. 互联网理财系统开发-满足投资人随投随取、多种产品、多种选择、风险更小、收益更多
  20. v-text与v-html,v-text,v-html等区别

热门文章

  1. Ubuntu安装Nixnote,解决印象笔记(国服/中国区)登录不能显示输入密码的问题
  2. 快速检索2021年EI会议论文的方法
  3. 【Linux】创建、修改和删除用户组(groupadd | groupmod | groupdel)
  4. 学习C的知识点扩展2--make和makefile多文件编译的使用
  5. VR全景展现预装修,让传统的家装行业不断升级
  6. 将原神角色导入unity 完整版
  7. 杭州辣府餐饮JAVA_超全“滨江美食必打卡list”,不收藏会后悔!年前再去搓几顿啊~...
  8. 《CSS实战案例汇总》涟漪
  9. android 实现ble蓝牙自动配对连接
  10. 计算机什么是符号健,在电脑健盘上怎么打:符号