翻译自:
 

A.7 HugePages概述

HugePages是集成到Linux内核2.6中的一项特性。启用HugePages使操作系统可以支持的内存页大于默认值(通常为4 KB)。使用非常大的页面大小可以通过减少访问page table entries所需的系统资源量来提高系统性能。HugePages对32位和64位配置都很有用。HugePage大小从2 MB到256 MB不等,具体取决于内核版本和硬件架构。对于Oracle数据库,使用HugePages可以减少page states的操作系统维护,并提高转换后备缓冲区(Translation Lookaside Buffer ,TLB)命中率。

注意:

透明Hugepages目前不是手动配置HugePages的替代方案。

本节包括以下主题:

A.7.1查看HugePages内存分配

如果您的操作系统启用了HugePages,请查看此信息。

在Linux平台安装中,Oracle建议您使用HugePages获取Oracle数据库的最佳性能。在启用了HugePages的服务器上升级Oracle Grid Infrastructure和Oracle数据库时,Oracle建议您查看HugePages内存分配要求。

GIMR和HugePages内存

Oracle Grid Infrastructure安装包括Grid Infrastructure Management Repository(GIMR)。如果在群集成员节点上配置了HugePages,GIMR系统全局区域(SGA)将安装到HugePages内存中。GIMR SGA最高占用1 GB的HugePages内存。

如果群集成员节点操作系统内存分配到HugePages不足以满足群集上所有Oracle数据库实例的SGA大小,那么您可能会发现一个或多个Oracle数据库SGA映射到常规页面,而不是的巨大页面,降低了预期的性能。为避免此问题,在计划升级时,请确保为HugePages保留的内存足够大,以满足您的内存要求。

为集群上计划运行SGA的所有数据库分配足够大的内存到HugePages,也要考虑到Grid Infrastructure Management Repository的SGA。

笔记:也就是说每个节点可能运行多个共享内存段,比如有GI的SGA,有多个数据库实例,那么HugePages 应该大于他们内存的总和

A.7.2在Linux上使用HugePages

要使Oracle数据库在Linux上使用大页面(有时称为HugePages),请设置vm.nr_hugepages内核参数的值以指定要保留的大页面数。您必须指定足够的大页面来保存数据库实例的整个SGA。要确定所需的参数值,请将实例的SGA大小除以大页面的大小,然后将结果向上舍入为最接近的整数。

要确定默认的大页面大小,请运行以下命令:

# grep Hugepagesize /proc/meminfo

例如,如果/proc/meminfo 显示大页面大小2 MB,并且实例的总SGA大小为1.6 GB,则将vm.nr_hugepages内核参数的值设置为820(1.6 GB / 2 MB = 819.2)。

A.7.3使用HugePages调整SGA

如果没有HugePages,操作系统会将每个4 KB的内存保留为一个page。当它将pages分配给数据库系统全局区域(SGA)时,操作系统内核必须为分配给该数据库SGA的每个4 KB页面不断更新其page table 上的生命周期(脏,空,映射到进程等)。

使用HugePages,操作系统页表(虚拟内存到物理内存映射)较小,因为每个页表条目指向2 MB到256 MB的页面。

此外,内核中生命周期必须受到监视的pages较少。例如,如果将HugePages与64位硬件一起使用,并且要映射256 MB内存,则可能需要一个page table entry(PTE)。如果您不使用HugePages,并且想要映射256 MB内存,则必须具有256 MB * 1024 KB / 4 KB = 65536个PTE。

HugePages具有以下优势:

  • 通过增加TLB命中率提高性能

  • 页面被锁定在内存中,永远不会被换出,这为共享内存结构(如SGA)提供了RAM

  • 连续页面是预分配的,不能用于除System V共享内存之外的任何其他内容(例如,SGA)

  • 由于页面大小较大,内核对于该部分虚拟内存的簿记工作较少 笔记:SGA是虚拟内存,RAM 是物理内存,它们之间有一个映射关系,使用HugePage,需要维护的映射关系减少。

A.7.4在Linux上配置HugePages

完成以下步骤以在计算机上配置HugePages:

  1. 运行以下命令以确定内核是否支持HugePages:

    $ grep Huge / proc / meminfo
    
  2. 某些Linux系统默认不支持HugePages。对于此类系统,请使用CONFIG_HUGETLBFS和CONFIG_HUGETLB_PAGE 配置选项构建Linux内核。CONFIG_HUGETLBFS位于文件系统下,在您选择CONFIG_HUGETLBFS时,CONFIG_HUGETLB_PAGE会被一并选中。

  3. 编辑文件中的memlock设置/etc/security/limits.conf。该memlock设置以KB为单位指定,当启用HugePages内存时,最大锁定内存限制应设置为当前RAM的至少90%,并且当禁用HugePages内存时,应设置至少3145728 KB(3 GB)。例如,如果安装了64 GB RAM,则添加以下条目以增加最大锁定内存地址空间:

    *   soft   memlock    60397977
    * hard memlock 60397977

    您还可以将memlock值设置为高于SGA要求.

  4. 已oracle用户重新登陆,运行ulimit -l 命令验证新memlock设置.

    $ ulimit -l
    60397977
  5. 运行以下命令以显示Hugepagesize变量的值:

    $ grep Hugepagesize / proc / meminfo
  6. 完成以下过程以创建一个脚本,该脚本计算当前共享内存段的hugepages配置建议值:

    1. 创建一个名为hugepages_settings.sh 的文本文件。

    2. 在文件中添加以下内容:

    #!/bin/bash
    #
    # hugepages_settings.sh
    #
    # Linux bash script to compute values for the
    # recommended HugePages/HugeTLB configuration
    #
    # 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.
    # 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'}`
    # Start from pages to be on the safe side and guarantee free HugePage
    NUM_PG=
    # Cumulative number of pages required to handle the running shared memory segments
    for SEG_BYTES in `ipcs -m | awk {'print $5'} | grep "[0-9][0-9]*"`
    do
    MIN_PG=`echo "$SEG_BYTES/($HPG_SZ*1024)" | bc -q`
    if [ $MIN_PG -gt ]; then
    NUM_PG=`echo "$NUM_PG+$MIN_PG+1" | bc -q`
    fi
    done
    # 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'|'3.8') echo "Recommended setting: vm.nr_hugepages = $NUM_PG" ;;
    *) echo "Unrecognized kernel version $KERN. Exiting." ;;
    esac
    # End
  7. 运行hugepages_settings.sh 计算hugepages 参数值.

    $ chmod + x hugepages_settings.sh
    $ ./hugepages_settings.sh

    注意:

    在运行此脚本之前,请确保所有使用hugepages的应用程序都在运行。

  8. 设置以下内核参数,其中value是您在步骤7中确定的HugePages值:

    #sysctl -w vm.nr_hugepages = value
  9. 要确保在系统重新启动后自动分配HugePages,请将以下条目添加到/etc/sysctl.conf文件中,其中value是您在步骤7中确定的HugePages值:

    vm.nr_hugepages = value
  10. 运行以下命令以检查可用hugepages:

    $ grep Huge /proc/meminfo
  11. 重启实例。
  12. 运行以下命令检查可用hugepages(1或2 pages 空闲):

    $ grep Huge /proc/meminfo

    注意:

    如果您无法通过nr_hugepages设置HugePages,则您的可用内存可能是碎片化的。重新启动服务器以使Hugepages分配生效

A.7.5 HugePages配置的限制

HugePages具有以下限制:

  • 您必须取消设置MEMORY_TARGETMEMORY_MAX_TARGET初始化参数。例如,要取消设置数据库实例的参数,请使用命令ALTER SYSTEM RESET

  • 自动内存管理(AMM)和HugePages不兼容。使用AMM时,整个SGA内存通过在/dev/shm下创建文件来分配。当Oracle数据库使用AMM分配SGA时,HugePages不支持。要在Oracle Database 19c上使用HugePages,您必须禁用AMM。

  • 如果在32位环境中使用VLM(Very Large Memory),则不能将HugePages用于Database Buffer cache。可以用于SGA的其他部分,如shared_pool, large_pool等。VLM(buffer cache)的内存分配使用共享内存文件系统(ramfs/tmpfs/shmfs)完成。内存文件系统不提供或使用HugePages。

  • 除非系统管理员通过修改可用页数或修改池大小来更改HugePages配置,否则HugePages不会在系统启动后进行分配或释放。如果在系统启动期间未在内存中预留所需的空间,则HugePages分配失败。

  • 确保正确配置HugePages,因为如果过多的HugePages未被应用程序使用,系统可能会耗尽内存。笔记:vm.nr_hugepages不能配置过大

  • 如果实例启动时HugePages不足,且初始化参数use_large_pages设置为的only,则数据库无法启动,并且警报日志消息提供有关Hugepages的必要信息。

A.7.6 禁用透明HugePages

Oracle建议您在开始安装之前禁用Transparent HugePages。

透明HugePages内存与标准HugePages内存不同,因为内核khugepaged线程在运行时动态分配内存。标准HugePages内存在启动时预先分配,并且在运行时不会更改。

注意:

虽然在UEK2和更高版本的UEK内核上禁用了透明HugePages,但您的Linux系统上可能默认启用了Transparent HugePages。

Red Hat Enterprise Linux 6,Red Hat Enterprise Linux 7,SUSE 11,Oracle Linux 6和Oracle Linux 7 早期版本的Oracle Linux具有Unbreakable Enterprise Kernel 2(UEK2)内核默认启用了透明HugePages内存。

透明HugePages可能会在运行时导致内存分配延迟。为避免性能问题,Oracle建议您在所有Oracle数据库服务器上禁用透明HugePages。Oracle建议您使用标准HugePages来提高性能。

要检查是否已启用Transparent HugePages,请以root用户身份运行以下命令之一:

红帽企业Linux内核:

# cat /sys/kernel/mm/redhat_transparent_hugepage/enabled

其他内核:

# cat /sys/kernel/mm/transparent_hugepage/enabled

以下是一个示例输出,显示正在使用透明HugePages,因为[always]标志已启用。

[always] never 

注意:

如果从内核中删除了Transparent HugePages ,则既不存在/sys/kernel/mm/transparent_hugepage 也不存在/sys/kernel/mm/redhat_transparent_hugepage

要禁用透明HugePages:

  1. 对于Oracle Linux 6或更早版本,请将以下条目添加到/etc/grub.conf文件中的内核引导行:

    transparent_hugepage=never
    例如:

    title Oracle Linux Server (2.6.-300.25..el6uek.x86_64)
    root (hd0,)
    kernel /vmlinuz-2.6.-300.25..el6uek.x86_64 ro root=LABEL=/ transparent_hugepage=never
    initrd /initramfs-2.6.-300.25..el6uek.x86_64.img

    对于Oracle Linux 7或更高版本的操作系统,文件名可能有所不同。检查操作系统文档以获取确切的文件名和禁用透明HugePages的步骤。

    例如,对于Oracle Linux 7.3,禁用透明HugePages的过程涉及编辑/etc/default/grub文件然后运行命令grub2-mkconfig

  2. 重新启动系统以使更改成为永久更改。

步骤简化整理

1.设定锁定内存的最大资源限制(单位kB),建议设置为90%RAM.
如 RAM=64G时,memlock=64*1024*1024*90%=60397977
vi /etc/security/limits.conf 
* soft memlock
* hard memlock
这里只是资源限制,并不是配置这么多就用这么多。决定用多少的是sysctl.conf文件
 
2.启动节点上所有要用共享内存的进程(包括GI和所有的数据库实例)
    启动后才产生共享内存段,才可以使用官方脚本计算应该配置多少HugePages。
 
3.通过官方脚本计算应该配置使用多少HugePages
vi hugepages_settings.sh
#!/bin/bash
#
# hugepages_settings.sh
#
# Linux bash script to compute values for the
# recommended HugePages/HugeTLB configuration
#
# 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.
# 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'}`
# Start from pages to be on the safe side and guarantee free HugePage
NUM_PG=
# Cumulative number of pages required to handle the running shared memory segments
for SEG_BYTES in `ipcs -m | awk {'print $5'} | grep "[0-9][0-9]*"`
do
MIN_PG=`echo "$SEG_BYTES/($HPG_SZ*1024)" | bc -q`
if [ $MIN_PG -gt ]; then
NUM_PG=`echo "$NUM_PG+$MIN_PG+1" | bc -q`
fi
done
# 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'|'3.8') echo "Recommended setting: vm.nr_hugepages = $NUM_PG" ;;
*) echo "Unrecognized kernel version $KERN. Exiting." ;;
esac
# End

chmod +x hugepages_settings.sh

./hugepages_settings.sh
 
4.配置Hugepages
vi /etc/sysctl.conf
vm.nr_hugepages = value #来自上一步计算结果

5.禁用透明HugePages

检查当前是否启用了透明HugePages:
cat /sys/kernel/mm/redhat_transparent_hugepage/enabled    # [always] 表示已启用
禁用方法:
添加transparent_hugepage=never参数到/etc/grub.conf 文件中的 kernel 引导行
 
6.重启服务器
一方面禁用透明HugePages需要重启,另一方面启用HugePages大部分情况也需要重启。

HugePages概述--翻译自19C文档的更多相关文章

  1. 中文翻译:pjsip文档(四)之ICE Session的使用方法

    1:pjsip教程(一)之PJNATH简介 2:pjsip教程(二)之ICE穿越打洞:Interactive Connectivity Establishment简介 3:pjsip教程(三)之ICE ...

  2. YUV视频格式详解(翻译自微软文档)

    原文: https://docs.microsoft.com/en-us/previous-versions/aa904813(v=vs.80) YUV视频格式详解(翻译自微软文档)https://b ...

  3. 使用 Python 翻译 CHM 帮助文档

    此方法绝对切实可行 翻译成品项目: https://github.com/foyoux/InstallShield2020-Documents 效果预览 安装 docts 库 pip install ...

  4. [翻译] Autofac 入门文档

    原文链接:http://docs.autofac.org/en/latest/getting-started/index.html 在程序中使用Autofac的基本模式是: 用控制反转(IoC)的思想 ...

  5. React翻译官网文档之JSX

    什么是JSX? 看下面的代码它被称为JSX,它既不是字符串也不是HTML,而是一种facebook公司对javascript语法的拓展.虽然写法很奇怪最终仍会会被编译为javascript代码 con ...

  6. 翻译:SockJS-node文档(一)

    什么是SockJS? SockJS是一个提供Websocket通信的JavaScript库,目的是实现在浏览器与服务器之间低延迟.全双工.跨域通信,它提供跨浏览器的统一API,即使不支持HTML5 W ...

  7. 深入分析MFC文档视图结构(项目实践)

    k_eckel:http://www.mscenter.edu.cn/blog/k_eckel 文档视图结构(Document/View Architecture)是MFC的精髓,也是Observer ...

  8. Ext JS 6学习文档–第1章–ExtJS入门指南

    Ext JS 入门指南 前言 本来我是打算自己写一个系列的 ExtJS 6 学习笔记的,因为 ExtJS 6 目前的中文学习资料还很少.google 搜索资料时找到了一本国外牛人写的关于 ExtJS ...

  9. python文档自动翻译

    关键方法 提取文档内容 读取TXT文档 txt文档的读取很简单,直接用python自带的open()方法就好,代码如下所示: # 读取TXT文档 def read_txt(path): '''实现TX ...

随机推荐

  1. 【Leetcode_easy】754. Reach a Number

    problem 754. Reach a Number solution1: class Solution { public: int reachNumber(int target) { target ...

  2. 理解ADFS相关概念

    核心概念 Claims是?Token是?Security Token是?Security Token Server (STS)是? 声明与令牌无关,但通过封装在安全令牌中来进行网络传输! SSL证书是 ...

  3. 手写C++代码实现POST传输数据

    char *pHttpPost = "POST %s HTTP/1.1\r\n" "Host: %s:%d\r\n" "Content-Type: a ...

  4. pytest文档20-pytest-html报告优化(添加Description)

    前言 pytest-html测试报告默认是不展示用例描述Description内容,之前用unittest生成的报告是可以展示用例的描述,也就是test开头的用例下三个引号里面的注释(docstrin ...

  5. AWS 核心服务概述(二)

    目录 AWS网络服务 VPC Direct Connect Route53 AWS 计算服务 EC2 EMR(Elastic MapReduce) AWS Lambda Auto Scaling El ...

  6. EventBus使用的坑

    最近使用eventbus发送通知,在想该怎么携带List集合数据.于是尝试直接发送List. 使用一次,正常接收.使用两次,出现类转换异常.原来在接收List类型的消息时,并不会管List内的泛型,是 ...

  7. socket通信时如何判断当前连接是否断开--select函数,心跳线程,QsocketNotifier监控socket

    client与server建立socket连接之后,如果突然关闭server,此时,如果不在客户端close(socket_fd),会有不好的影响: QsocketNotifier监控socket的槽 ...

  8. 部署系统报404.有可能是tomcat存在多个进程

      今天对需求进行系统升级部署,本以为只需要几分钟的事,结果却遇到了怪事 我是用Jenkins集成部署的,之前都是点一下几分钟就可以了,结果这次部署完成之后 一直报404,一直打不开页面,很无奈,就去 ...

  9. WUSTOJ 1246: 字符串排序(Java)

    1246: 字符串排序 题目   输入n(n<100)个字符串,每个字符串长度不超过1000,将他们按字典顺序输出.更过内容点击标题. 分析   Java中的ArrayList()可以比较方便的 ...

  10. 【Scratch】它跟Mindstorms,有什么区别?

    第197篇文章 老丁的课程 在正式开始这套课程之前,依照老丁的习惯,还是要给大家白话下东西,该怎么学? 本节课,来讲讲我对于学习这个软件(包括和EV3配合起来)的一些看法.同时,也给小朋友们一些编程学 ...