您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關如何進行linux內存的Hugepages優化,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
Hugepages是從Linux kernal 2.6后被引入的,其目的是使用更大的memory page size以適應越來越大的系統內存。
理論知識:
(1. Page Table大小
而Hugepages的常見page size為2M,是4k size的500倍,所以可以大大減小page table的size。
這是一個沒有配置Hugepage的系統,系統內存128G,pagetable大小大約為4G。
cat /proc/meminfo MemTotal: 132086880 kB PageTables: 4059612 kB 這是配置了Hugepage的系統,系統內存96G, PageTable大小僅為78M MemTotal: 98999880 kB PageTables: 79916 kB
進程的虛擬內存地址段先連接到page tables然后再連接到物理內存。所以在訪問內存時需要先訪問page tables得到虛擬內存和物理內存的映射關系,然后再訪問物理內存。
(3.使用Hugepages的內存頁是不會被交換出去的,永遠常駐在內存中,所以也減少了內存也替換的額外開銷
2、數據庫服務器上使用Hugepages要注意的幾點
比如說Hugepages設置為90G,oracle SGA為91G,那么oracle在啟動的時候就不會使用到這90G的Hugepages。這90G就浪費了。所以在設置Hugepages時要計算SGA的大小,后面會給出一個腳本來計算。
(3. PGA不會使用Hugepages的內存。所以11g的AMM (Automatic Memory Management,memory_target參數)是不被支持的。而ASMM(Automatic Shared Memory Management, SGA_target參數)是被支持的,這兩個不要搞混淆了。
舉例說明:
HugePages_Total: 43000 HugePages_Free: 29493 HugePages_Rsvd: 23550 Hugepagesize: 2048 kB HugePages_Total為所分配的頁面數目,和Hugepagesize相乘后得到所分配的內存大小。43000*2/1024大約為84GB HugePages_Free為從來沒有被使用過的Hugepages數目。即使oracle sga已經分配了這部分內存,但是如果沒有實際寫入,那么看到的還是Free的。這是很容易誤解的地方 HugePages_Rsvd為已經被分配預留但是還沒有使用的page數目。在Oracle剛剛啟動時,大部分內存應該都是Reserved并且Free的,隨著oracle SGA的使用,Reserved和Free都會不斷的降低 HugePages_Free – HugePages_Rsvd 這部分是沒有被使用到的內存,如果沒有其他的oracle instance,這部分內存也許永遠都不會被使用到,也就是被浪費了。在該系統上有11.5GB的內存被浪費了。
3、設置HugePages步驟:
在/etc/security/limits.conf文件中添加memlock的限制,注意該值略微小于實際物理內存的大小。比如物理內存是64GB,可以設置為如下:
* hard memlock 60397977
如果使用了Oracle Linux的oracle?-validated包,或者Exadata DB compute會自動配置這個參數。
第二步:驗證memlock使用如下命令查看參數值: 這里,最好是重啟一下服務器再驗證,比較穩妥
60397977
第三步:11g中禁用AMM ----注意
另外:默認情況下ASM instance也是使用AMM的,但因為ASM實例不需要大SGA,所以對ASM實例使用HugePages意義不大。
確保所有的數據庫實例都已經啟動,包括ASM實例。使用hugepages_settings.sh腳本獲取thevm.nr_hugepages內核參數的建議值。
...(略)
...
驗證配置:
為了確保HugePages配置的有效性,HugePages_Free值應該小于HugePages_Total的值,并且應該等于HugePages_Rsvd的值。
實例:機器配置:128G物理內存+56G的SGA
root># grep HugePages /proc/meminfo HugePages_Total: 28674 HugePages_Free: 707 HugePages_Rsvd: 706
附計算hugepages腳本:
#!/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 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. Before proceeding with the execution please 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}'` # Initialize the counter NUM_PG=0 # 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 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
以上就是如何進行linux內存的Hugepages優化,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。