標籤:
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
的數量。
參考 :
http://hsbxxl.blog.51cto.com/181620/1075166
http://blog.csdn.net/herecles/article/details/16861743
http://oracle.codemach.com/zai-linux-xia-wei-oracle-kai-qi-da-ye-hugepage.html
http://blog.itpub.net/17203031/viewspace-775004
Linux Hugepage ,AMM及 USE_LARGE_PAGES for oracle 11G(轉載)