HugePages詳解

jason_yehua發表於2022-12-02

參考文件:

HugePages and Oracle Database 11g Automatic Memory Management (AMM) on Linux (  文件  ID 749851.1)

HugePages on Linux: What It Is... and What It Is Not... (  文件  ID 361323.1)

HugePages on Oracle Linux 64-bit (  文件  ID 361468.1)

Shell Script to Calculate Values Recommended Linux HugePages / HugeTLB Configuration (  文件  ID 401749.1)

/proc/meminfo Does Not Provide HugePages Information on Oracle Enterprise Linux (OEL5) (  文件  ID 860350.1)

Hugepages are Not used by Database Buffer Cache (  文件  ID 829850.1)

 

正文:

HugePages  是透過使用大頁記憶體來取代傳統的  4kb  記憶體頁面,使得管理虛擬地址數變少,加快了從虛擬地址到實體地址的對映以及透過摒棄記憶體頁面的換入換出以提高記憶體的整體效能。尤其是對於  8GB  以上的記憶體以及較大的  Oracle SGA size  ,建議配值並使用  HugePage  特性

 

的大小

huge page  的大小取決於所使用的作業系統的核心版本以及不同的硬體平臺
可以使用  $grep Hugepagesize /proc/meminfo  來檢視  huge page  的大小,對於較大的系統記憶體以及  sga  ,使用  hugepage  可以極大程度的提高  Oracle  資料庫效能

 

本次配置過程詳見文件:
HugePages on Oracle Linux 64-bit (
  文件  ID 361468.1)

本操作基於  RHEL 6  進行測試:

[root@rehl6 ~]# more /etc/redhat-release

Red Hat Enterprise Linux Server release 6.2 (Santiago)

[root@rehl6 ~]# uname -a

Linux rehl6 2.6.32-220.el6.x86_64 #1 SMP Wed Nov 9 08:03:13 EST 2011 x86_64 x86_64 x86_64 GNU/Linux

檢視當前系統是否配值HugePages

下面的查詢中  HugePages  相關的幾個值都為  0  ,表明當前未配值  HugePages  ,其次可以看到

[root@rehl6 ~]#

AnonHugePages:   1142784 kB

HugePages_Total:       0

HugePages_Free:        0

HugePages_Rsvd:        0

HugePages_Surp:        0

Hugepagesize:       2048 kB

 

修改使用者的memlock  限制

透過修改  /etc/security/limits.conf  配值檔案來實現

   該引數的值通常配值位略小於當前的已安裝系統記憶體,如當前你的系統記憶體為  64GB  ,可以做如下設定

  *   soft   memlock    60397977

  *   hard   memlock    60397977

   上述的設定單位為  kb  ,不會降低系統效能。至少也要配值為略大於系統上所有  SGA  的總和。

   使用  ulimit -l  來校驗該設定

禁用AMM(Oracle 11g)

如果當前的  Oracle  版本為  10g  ,可以跳過此步驟。

如果當前的  Oracle  版本為  11g  ,由於  AMM(Automatic Memory Management)  特性與  Hugepages  不相容,需要禁用  AMM 

ALTER SYSTEM RESET memory_target SCOPE=SPFILE;

ALTER SYSTEM RESET memory_max_target SCOPE=SPFILE;

ALTER SYSTEM SET sga_target=<n>g SCOPE=SPFILE;

ALTER SYSTEM SET pga_aggregate_target=<n>g SCOPE=SPFILE;

SHUTDOWN IMMEDIATE;

STARTUP;

 

計算vm.nr_hugepages 

簡單的計算方法如下:(只做系統估計)

簡單的計算原理是  total SGA_MAX_SIZE(  多個  instance  的總和)  /hugepagesize + N

N  為少量記憶體盈餘,一般多出  100  就足夠了。如果主機記憶體  128GB  ,計劃  70GB  用於  SGA  共享記憶體,則大記憶體頁需  70×1024/2=35840

使用  Oracle  提供的指令碼  hugepages_settings.sh  的指令碼來計算  vm.nr_hugepages  的值(這個值設定的是  hugepage momory  的大小)

   在執行指令碼之前確保所有的  Oracle  例項已啟動以及  ASM  也啟動  (  存在的情形下  )

  $ ./hugepages_settings.sh

該文件指令碼可以參看  MOS  文件,附錄一提供摘錄


Shell Script to Calculate Values Recommended Linux HugePages / HugeTLB Configuration (
  文件  ID 401749.1)

 

設定vm.nr_hugepages  引數

編輯  /etc/sysctl.conf  來設定  vm.nr_hugepages  引數

  $ sysctl -w vm.nr_hugepages = 1496  (該值為上述指令碼獲得的值,  vm.nr_hugepages  指明瞭記憶體頁數)   

  $ sysctl -p

 

重啟例項及服務:

上述的所有步驟已經實現了動態修改,但對於  HugePages  的分配需要重新啟動主機  server  才能生效。

 

驗證

HugePages  相關引數的值會隨著當前伺服器上的例項的停止與啟動而動態發生變化

   通常情況下,  HugePages_Free  的值應當小於  HugePages_Total  的值,在  HugePages  被使用時  HugePages_Rsvd  值應當為非零值。

  $ grep Huge /proc/meminfo

  HugePages_Total:   131

  HugePages_Free:     20

  HugePages_Rsvd:     20

  Hugepagesize:     2048 kB

 

   如下面的情形,當伺服器上僅有的一個例項被關閉後,  HugePages_Rsvd  的值為零。且  HugePages_Free  等於  HugePages_Total

  $ grep Huge /proc/meminfo

  HugePages_Total:   131

  HugePages_Free:    131

  HugePages_Rsvd:      0

  Hugepagesize:     2048 kB  

 

 

後續備註  :

/etc/security/limits.conf  配值檔案中  memlock  引數的值通常配值位略小於當前的已安裝系統記憶體

 

2. Hugepagesize  LINUX  的大頁的大小為  2M  這是不能改變的,而且大頁在  oracle  伺服器上只與引數  sga_max_size  有關,  hugepage  目前只能用於共享記憶體段等少量記憶體型別,例如  oracle SGA    PGA  則不適用,所以不能隨便亂設定大頁內容,如果沒有  oracle  提供的指令碼,我們只需要簡單的計算原理:  total SGA_MAX_SIZE(  多個  instance  的總和)  /hugepagesize + N N  為稍微超出一點的記憶體大小,如果主機記憶體  128GB  ,計劃  70GB  用於  SGA  共享記憶體,則大記憶體頁需  70×1024/2=35840

 

vm.nr_hugepages  引數指定了大頁的數目,大頁數目  *2    2048K  大頁每頁的大小)就是可以使用的記憶體大頁總大小。

huge page  的大小
huge page 
的大小取決於所使用的作業系統的核心版本以及不同的硬體平臺
可以使用  $grep Hugepagesize /proc/meminfo  來檢視  huge page  的大小
下面是不同平臺常用的  huge page  的大小。
HW Platform Source Code Tree  Kernel 2.4  Kernel 2.6
----------------- ---------------------  ------------  -------------
Linux x86 (IA32) i386  4 MB  4 MB * 
Linux x86-64 (AMD64, EM64T)  x86_64  2 MB  2 MB 
Linux Itanium (IA64) ia64  256 MB    256 MB 
IBM Power Based Linux (PPC64) ppc64/powerpc  N/A **    16 MB 
IBM zSeries Based Linux s390  N/A 1 MB 
IBM S/390 Based Linux s390  N/A   N/A

附錄

附錄一

(  該指令碼不同版本或許會有些許變化,建議參考檔案重新下載)

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.

#

# This script is provided by Doc ID 401749.1 from   My Oracle Support

#

 

# Welcome text

echo "

This script is provided by Doc ID 401749.1 from   My Oracle Support

() 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   -m

 

 

Press 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" ];then

    echo   "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]*"`

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`

    fi

done

 

RES_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 ]; 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   -m

 

of 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" ;;

     *)   echo "Unrecognized kernel version $KERN. Exiting." ;;

esac

 

# End


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31547506/viewspace-2926345/,如需轉載,請註明出處,否則將追究法律責任。

相關文章