HugePages詳解
參考文件:
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- HugePages on LinuxLinux
- 【TUNE_ORACLE】Oracle資料庫與HugePages(二)HugePages配置和限制Oracle資料庫
- [20191211]hugepages pagetables.txt
- 【TUNE_ORACLE】Oracle資料庫與HugePages(一)HugePages概念和優勢Oracle資料庫
- [201804012]關於hugepages 3.txt
- 【TUNE_ORACLE】Oracle資料庫與HugePages(三)HugePages常見問題和解決辦法Oracle資料庫
- [20191129]關於hugepages的問題.txt
- [20221125]設定hugepages遇到的問題.txt
- [20191202]關於hugepages相關問題.txt
- How to disable transparent hugepages (THP) on Red Hat Enterprise Linux 7Linux
- [20191202]關於oracle例項是否使用hugepages問題.txtOracle
- http協議/cookie詳解/session詳解HTTP協議CookieSession
- Java註解最全詳解(超級詳細)Java
- Lombok 註解詳解Lombok
- @FeignClient註解詳解client
- Java 註解詳解Java
- Java註解詳解Java
- [20191204]關於oracle例項是否使用hugepages問題2.txtOracle
- FindResource詳解
- DP 詳解
- HttpUtils 詳解HTTP
- HDMI詳解
- RIAD詳解
- iperf詳解
- dBFS詳解
- kubectl詳解
- 列表詳解
- Callback詳解
- ARM 詳解
- Symbol詳解Symbol
- Dockerfile詳解Docker
- Service詳解
- Pod詳解
- HTML詳解HTML
- Weakmap詳解
- MyBatisPlus詳解MyBatis
- Git詳解Git
- GRPC詳解RPC