前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >关于hugepage

关于hugepage

原创
作者头像
laosu
修改2021-03-14 17:16:44
6360
修改2021-03-14 17:16:44
举报
文章被收录于专栏:db小强
介绍

HugePages是Linux内核2.6+集成的一个功能,可以允许管理大于4KB的页。

相关概念

  • Page Table:页表是操作系统存储的虚拟地址和物理地址的映射的数据结构.
  • TLB: A Translation Lookaside Buffer (TLB),是CPU的一个固定大小的buffer,缓存了部分内存页表,可以更快进行虚拟地址转换。
  • hugetlb: 是TLB中指向HugePage的入口,通常等同于HugePage
  • hugetlbfs: 是2.6内核中新的像tmpfs的内存文件系统
为什么需要

如果你使用大内存及大的SGA,那HugePages是加快数据库性能的重要因素,优点如下:

  • 页变大页数变少: 默认页是4K,而HugePageTLB是2048K,意味着页数少512倍
  • 减少页表 Walking
  • 更少的内存操作成本
  • 更少的内存使用
  • 没有内存交换
  • 没有 'kswapd' 操作:正常页kswapd 会占用大量CPU资源(i.e. 13 million page table     entries for 50GB memory). 而使用HugePages,则不需要。
如何配置

Step 1: vi/etc/security/limits.conf   单位KB,设置比SGA大没问题。使用oracle-validated包和exadata默认会被设置。也可以在etc/security/limits.d/  目录下设置。

*  soft   memlock    60397977 *   hard   memlock    60397977

Step 2: 重新登陆oracle,check

$ ulimit -l 60397977

Step 3: AMM同hugepages不兼容,需先禁用(11.2.0.3+默认不配置AMM),不然会有如下报错:

ORA-00845:MEMORY_TARGET not supported on this system

Step4: 开启数据库实例,包括ASM,使用如下脚本计算vm.nr_hugepages:

$ ./hugepages_settings.sh ... Recommended setting: vm.nr_hugepages = 1496 $

Step 5: vi /etc/sysctl.conf  设置 vm.nr_hugepages,sysctl -p:

... vm.nr_hugepages = 1496 ...

Step6: 停实例,重启server(最佳实践建议重启)系统重启后,启动实例,检查是否生效, HugePages_Free value应该小于HugePages_Total:

# grep HugePages/proc/meminfo HugePages_Total:    1496 HugePages_Free:      485 HugePages_Rsvd:      446 HugePages_Surp:        0

如果所有oracle实例PRE_PAGE_SGA参数是false,参数HugePages_Rsvd>0。12.1之前该参数默认false,12.1开始该参数默认为true

NOTES

HugePages配置基于内在和运行实例的SGA,如下变化需重新配置

  • OS总内存变化
  • 添加新实例
  • 实例SGA变化

如下情况需要评估HugePages配置是否合适:

  • 数据库性能很差
  • 系统OOM或过多swapping
  • 实例不能启动
  • 重要的服务失败

参考:mos 361468.1

附:hugepages_settings.sh

代码语言:javascript
复制
#!/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.## This script is provided by Doc ID 401749.1 from My Oracle Support # http://support.oracle.com# Welcome textecho "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. 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 and   you should accommodate this while calculating SGA 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 versionKERN=`uname -r | awk -F. '{ printf("%d.%d\n",$1,$2); }'`# Find out the HugePage sizeHPG_SZ=`grep Hugepagesize /proc/meminfo | awk '{print $2}'`if [ -z "$HPG_SZ" ];then    echo "The hugepages may not be supported in the system where the script is being executed."    exit 1fi# Initialize the counterNUM_PG=0# Cumulative number of pages required to handle the running shared memory segmentsfor SEG_BYTES in `ipcs -m | cut -c44-300 | awk '{print $1}' | grep "[0-9][0-9]*"`do    MIN_PG=`echo "$SEG_BYTES/($HPG_SZ*1024)" | bc -q`    if [ $MIN_PG -gt 0 ]; then        NUM_PG=`echo "$NUM_PG+$MIN_PG+1" | bc -q`    fidoneRES_BYTES=`echo "$NUM_PG * $HPG_SZ * 1024" | bc -q`# An SGA less than 100MB does not make sense# Bail out if that is the caseif [ $RES_BYTES -lt 100000000 ]; then    echo "***********"    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 1fi# Finish with resultscase $KERN in    '2.2') echo "Kernel version $KERN is not supported. Exiting." ;;    '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" ;;esac# End

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 介绍
  • 为什么需要
  • 如何配置
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档