Linux Hugepage ,AMM及 USE_LARGE_PAGES for oracle 11G

龍山游龍發表於2015-08-14
1.  Hugepage基本概念 
    系統程式是透過虛擬地址訪問記憶體,但是CPU必須把它轉換成實體記憶體地址才能真正訪問記憶體。
為了提高這個轉換效率,CPU會快取最近的“虛擬記憶體地址和實體記憶體地址”的對映關係,並儲存在
一個由CPU維護的對映表(page table)中。
    page table(頁表)是作業系統上的虛擬記憶體系統的資料結構模型,用於儲存虛擬地址與物理地
址的對應關係。當我們訪問記憶體時,首先訪問"page table",然後Linux再透過"page table"的mapping
來訪問真實實體記憶體(RAM或SWAP).
    在32位系統下,一個程式訪問1GB的記憶體,會產生1M的頁表,如果是在64位系統,將會增大到2M。
很容易推算,如果一個SGA設定為60G,有1500個ORACLE使用者程式,64位LINUX的系統上,最大的頁表
佔用記憶體為:60*2*1500/1024=175G 。

    為了儘量提高記憶體的訪問速度,需要在對映表中儲存儘量多的對映關係。而在Redhat Linux中,
記憶體都是以頁(Page)的形式劃分的,預設情況下每頁是4K Bytes,這就意味著如果實體記憶體很大,比
如64G ,則對映表的條目將會非常多,這將會影響CPU的檢索效率(CPU需要轉化虛擬地址為實體地址)。
而且根據上面的推算,頁表會佔用比實體記憶體還多的記憶體大小。
   因記憶體大小是固定的,為了減少對映表的條目,可採取的辦法只有增加頁的尺寸。這種增大的內
存頁尺寸在Linux 2.1中,稱為Big page;在AS 3/4或後續版本中,稱為Hugepage。如果系統有大量
的實體記憶體(大於8G),則無論32位的作業系統還是64位的,都應該使用Hugepage。

2.  Hugepage基本資訊檢視 
   Linux中,可以透過如下命令來檢視HugePage相關的值:
$ cat /proc/meminfo | grep Huge
HugePages_Total:   0
HugePages_Free:    0
HugePages_Rsvd:    0
Hugepagesize:     2048 KB
  通常情況下,Linux hugepage大小為2MB (不同的處理器架構,可能不一樣)
HugePages_Total: Hugepage的頁面數量
HugePages_Free:  剩餘的頁面數量
HugePages_Rsvd:  被分配預留但是還沒有使用的page數目
Hugepagesize:    每單位數量大小
注意:  使用Hugepage記憶體是共享記憶體,它會一直pin在記憶體中,不會被交換出去,也就是說使用
hugepage的記憶體不能被其他的程式使用,所以一定要合理設定這個值,避免造成浪費。對於只使用
Oracle的伺服器來說,把Hugepage_pool設定成稍大於SGA大小即可。PGA因不是共享記憶體,是使用
不到Hugepage的。 
    HugePages_Free - HugePages_Rsvd部分的記憶體是浪費的,且不能被其他程式使用。在實際應用中,
儘可能讓HugePages_Free - HugePages_Rsvd=0
    設定了多少的huge page,free記憶體就會被使用多少。比如:設定sysctl vm.nr_hugepages=1024
之後, free命令可以看到free的記憶體會減少2048MB (1024*2M)。(這也和Hugepagesize的大小有關)
 
3.  Hugepage的好處:
a.  大大提高了CPU cache中存放的page table所覆蓋的記憶體大小,從而提高了TLB命中率。
b.  CPU cache中有一部分TLB(Translation Lookaside Buffer)用來存放部分page table以提高虛擬記憶體
地址到實體記憶體地址轉換的速度。因為page size變大了,所以同樣大小的TLB,所覆蓋的記憶體大小也變大了。
提高了TBL命中率,也就是提高了地址轉換的速度。
c. 減少CPU的sys的使用。由於提高了CPU的TLB的命中率,也就降低了CPU的sys部分的使用。
d. 大頁會將SGA LOCK在RAM裡, 當記憶體短缺的時候也不會被page out

4. 如何配置Hugepages 
   根據下面的步驟來配置Hugepages,修改Hugepages需要重啟機器。   
1). 需要在/etc/security/limits.conf 中設定memlock值(單位KB),該值小於記憶體大小,
例如你的記憶體大小是64G,有可以設定以下的值:  
*   soft   memlock    60397977 
*   hard   memlock    60397977
這個值大於SGA需求並沒有什麼害處。
 
如果是Exadata機器,引數要求請參考文件1284261.1
2). 重新登入root和oracle使用者,檢查memlock limit
$ ulimit -l 
60397977 
3). 如果你使用11G及以後的版本,AMM(自動記憶體管理)已經預設開啟,但是AMM與Hugepages
是不相容的(因為hugepage是共享記憶體,不適合PGA),必須先關閉AMM。
4). 確保你的全部例項都已經啟動(包括ASM) ,然後根據Document 401749.1 的hugepages_settings.sh
去評估需要設定的Hugepages的大小。  
$ ./hugepages_settings.sh 
... 
Recommended setting: vm.nr_hugepages = 1496
注:也可以自己計算需要的Hugepages大小,其實就是Hugepages size> all of the SGA size
5).  編輯/etc/sysctl.conf 設定 vm.nr_hugepages引數:
vm.nr_hugepages = 1496 
 
6).  停止例項並重啟OS系統 
7).  檢查設定是否生效 
系統重啟後,啟動全部的資料庫,透過以下命令檢查
 
# grep HugePages /proc/meminfo 
HugePages_Total:    1496 
HugePages_Free:      485 
HugePages_Rsvd:      446 
HugePages_Surp:        0
 
HugePages_Free< HugePages_Total 既說明Hugepages已經生效,同時HugePages_Rsvd不為“0”.

5.  如何控制資料庫SGA是否使用Hugepages?
 
  11.2.0.2之前的版本,DB的SGA只能選擇全部使用hugepages或者完全不使用hugepages。
 
  11.2.0.2 及以後的版本, oracle增加了一個新的引數“USE_LARGE_PAGES”來管理資料庫如何使用 hugepages.
  在11.2.0.3的時候,USE_LARGE_PAGES這個引數讓Oracle的行為更加靈活。如果出現HugePage分配不足的情況,
SGA是可以使用那些small pages的。這就保證了極端情況下資料庫是可以正常執行的。
 
USE_LARGE_PAGES引數有三個值: "true" (default), "only", "false" and "auto"(since 11.2.0.3 patchset).
 
a). 現在預設值是"true",如果系統設定Hugepages的話,SGA會優先使用hugepages,有多少用多少。 
11.2.0.2 如果沒有足夠的 hugepages, SGA是不會使用hugepages的. 這會導致ORA-4030錯誤,因為hugepages已
經從實體記憶體分配,但是SGA沒有使用它,卻使用其他部分記憶體,導致記憶體資源不足。  但是在11.2.0.3版本這個
使用策略被改變了,SGA可以一部分使用hugepages,剩餘部分使用small pages。這樣,SGA會有限使用hugepages,
在hugepages用完之後,再使用regular sized pages。
 
b). 如果設定為"false" , SGA就不會使用hugepages
 
c). 如果設定為 "only" 如果hugepages大小不夠的話,資料庫例項是無法啟動的 (防止記憶體溢位的情況發生).
 
d). 11.2.0.3版本之後,可以設定為 "auto".這個選項會觸發oradism程式重新配置linux核心,以增加hugepages
的數量。

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

相關文章