Linux Hugepage ,AMM及 USE_LARGE_PAGES for oracle 11G
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
的數量。
系統程式是透過虛擬地址訪問記憶體,但是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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Linux Hugepage ,AMM及 USE_LARGE_PAGES - 4Linux
- Linux Hugepage ,AMM及 USE_LARGE_PAGES - 3Linux
- Linux Hugepage ,AMM及 USE_LARGE_PAGES - 2Linux
- Linux Hugepage ,AMM及 USE_LARGE_PAGES - 1Linux
- Oracle 11g新引數USE_LARGE_PAGES與AMM使用Oracle
- Oracle 11g AMM與ASMM切換OracleASM
- 11g AMM和/dev/shmdev
- Linux 11G RAC啟用HugePages與AMM的禁用Linux
- Oracle ASMM和AMMOracleASM
- ORACLE與hugepage(二)Oracle
- ORACLE與hugepage(一)Oracle
- 為Linux版本Oracle 11gR2配置HugePageLinuxOracle
- 【HugePage】在Linux 64位系統下使用hugepageLinux
- linux的hugepage的配置-優化oracle記憶體 .Linux優化Oracle記憶體
- 在CentOS Linux 5中為oracle配置hugepage的方法CentOSLinuxOracle
- LINUX下為ORACLE資料庫設定大頁--hugepageLinuxOracle資料庫
- linux系統中配置hugepage,提升oracle資料庫效能LinuxOracle資料庫
- Linux HugePage技術簡介Linux
- oracle 11g 11.2.0.3 for oracle linux 6.3安裝文件及問題OracleLinux
- Oracle Memory Management and HugePage (連載一)Oracle
- Oracle Memory Management and HugePage (連載二)Oracle
- Oracle Memory Management and HugePage (連載三)Oracle
- HugePage在oracle中的應用Oracle
- ORACLE hugepage好處與壞處Oracle
- Oracle在Linux下對記憶體大頁HugePage的實踐OracleLinux記憶體
- Oracle USE_LARGE_PAGES初始化引數Oracle
- 用好HugePage,告別Linux效能故障Linux
- Linux下HugePage記憶體功能配置Linux記憶體
- 如何在redhat5為oracle啟用及配置hugepage大頁記憶體RedhatOracle記憶體
- Oracle Linux中安裝Oracle 11gOracleLinux
- [Oracle] oracle 11g database install(linux)OracleDatabaseLinux
- install oracle 11g for linuxOracleLinux
- Oracle 11g for linux 安裝OracleLinux
- 在Linux 64位系統下使用hugepageLinux
- 【AMM】關於ASM中AMM引數說明ASM
- AMM與ASMMASM
- Oracle 11g Windows 遷移至 LinuxOracleWindowsLinux
- linux下安裝oracle 11gLinuxOracle