記憶體_大頁記憶體

lusklusklusk發表於2016-05-24

AMM memory_target<>0 )情況下不能使用大頁記憶體。

 

 

大頁記憶體說明:


分頁儲存管理,是將一個程式的邏輯地址空間分成若干個大小相等的片,稱為頁面或頁,併為各頁加以編號,從 開始,如第 頁、第 1 頁等,這些頁面或頁又是頁表的頁表項

頁表大小 = 頁表項個數 × 頁表項大小

下例中: 6000 個大頁,這 6000 個大頁就是 6000 個頁號,存放在頁表中就要佔用 6000 個頁表項,一個頁表項多大呢,就是多少位, 64 位系統就是 8B ,也就是 8 位元組, 6000 頁表項 *8 位元組 =48KB

在分頁系統中的頁面其大小應適中。頁面若太小,一方面雖然可使記憶體碎片減小,從而減少了記憶體碎片的總空間,有利於提高記憶體利用率,但另一方面也會使每個程式佔用較多的頁面,從而導致程式的頁表過長,佔用大量記憶體;此外,還會降低頁面換進換出的效率。然而,如果選擇的頁面較大,雖然可以減少頁表的長度,提高頁面換進換出的速度,但卻又會使頁內碎片增大。因此,頁面的大小應選擇得適中,且頁面大小應是 2 的冪,通常為 512 B~8 KB

 

頁表記憶體計算

32 位系統下,一個程式訪問 1GB 的記憶體,會產生 1M 的頁表,如果是在 64 位系統,將會增大到 2M 很容易推算,如果一個 SGA 設定為 60G ,有 1500 Oracle 使用者程式, 64 Linux 的系統上,最大的頁表佔用記憶體為: 60*2*1500/1024=175G ,是的,你沒看錯,是 175G !但是實際情況看到的頁表佔用可能沒有這麼大,打個百分之四五十的折扣,這是因為只有伺服器程式訪問到 SGA 的特定區域後,程式才需要把這一塊對應的頁表項加入到自己的頁表中。

 

 

 

 

大頁記憶體的作用

1 :減少頁表大小,一個大頁對應連續的 2M 記憶體, 12G 的記憶體只要 6000 個大頁,而原來需要 24M 頁表( 64 位系統一個使用者訪問 1G 需要 2M 的頁表, 2*12=24 ),現在只需要 48KB 64 位系統一個頁表項為 8Bytes ,因為 8bytes=64bit

2 :大頁記憶體只能鎖定在實體記憶體中,不能交換到交換區,這樣就避免了交換引起的效能問題

3 :由於頁表的減少,使得 CPU 中的命中率大大提高

 

 

 

 

OS 層面檢視大頁使用情況


 

PageTables :頁表記憶體,耗記憶體 34M

HugePages_Total :大頁頁面數,和 Hugepagesize 相乘後得到所分配的記憶體大小。 43000*2/1024 大約為 84GB

HugePages_Free :從來沒有被使用過的大頁頁面數。即使 Oracle sga 已經分配了這部分記憶體,但是如果沒有實際寫入,那麼看到的還是 Free 的。這是很容易誤解的地方。

HugePages_Rsvd :已經被分配預留但是還沒有使用的大頁頁面數。在 Oracle 剛剛啟動時,大部分記憶體應該都是 Reserved 並且 Free 的,隨著 Oracle SGA 的使用, Reserved Free 都會不斷的降低。

HugePages_Free – HugePages_Rsvd :這部分是沒有被使用到的記憶體,如果沒有其他的 Oracle instance ,這部分記憶體也許永遠都不會被使用到,也就是被浪費了。在該系統上有 11.5GB 的記憶體被浪費了。

Hugepagesize :表示每個大頁頁面對應的大小

HugePages_Total* Hugepagesize= 大頁記憶體的總量

 

比如大頁記憶體 hugepages 總計 11GB sga_max_size 10G sga_target 8G DB 啟動後會根據 sga_max_size 分配 hugepages 記憶體,這裡為 10G ,真正 free hugepages 記憶體為 11-10=1G ,但是 sga_target 8G ,那麼會有 2G 不被訪問,則 hugepages_free 2+1=3G hugepage_Rsvd 記憶體有 2G ,這裡實際給其他例項使用的只有 1G ,也就是真正意義上的 free 只有 1G

 

到目前為止,大頁記憶體只能用於共享記憶體段等少量型別的記憶體。一旦將實體記憶體用作大頁記憶體,這些記憶體就不能用做其他用途,比如作為程式的私有記憶體,因此不能將過多的記憶體設定為大頁記憶體, 通常將大頁記憶體的頁數設定為:

Hugepage_total=ceil sga_max_size/hugepagesize +2

比如 SGA_MAX_SIZE=18G hugepagesize=2048kb ,則大頁記憶體的頁數 =ceil(18*1024/2)+2=9218

 

 

 

 

 

配置大頁記憶體的方法

1.       檢視記憶體是否支援大頁記憶體,檢視 /proc/meminfo 是否有 PageTables HugePages_Total 等項,如果沒有則需要在核心配置CONFIG_HUGETLBFS=y、CONFIG_HUGETLB_PAGE=y支援大記憶體頁


2.       修改 /etc/sysctl.conf 檔案,設定大頁記憶體的頁面數,增加如下,再執行 sysctl –p 使之生效,再檢查 /proc/meminfo 檢視 hugepages_total 如果小於設定的值,則說明沒有足夠的連續實體記憶體用於這些大頁記憶體,需要重啟伺服器使之生效

vm.nr_hugepages=9218

To determine the default large page size, run the following command:

# grep Hugepagesize /proc/meminfo

For example, if /proc/meminfo lists the large page size as 2 MB, and the total SGA size for the instance is 1.6 GB, then set the value for the vm.nr_hugepages kernel parameter to 820 (1.6 GB / 2 MB = 819.2).


3.       /etc/security/limits.conf 檔案中增加如下行 (oracle 使用者可以鎖定的記憶體大小,單位 KB)

oracle soft memlock 18878464

oracle hard memlock 18878464

 Edit the memlock setting in the /etc/security/limits.conf file. The memlock setting is specified in KB and set slightly lesser than the installed RAM. For example, if you have 64GB RAM installed, add the following entries to increase the max locked memory limit:

* soft memlock 60397977

* hard memlock 60397977

You can also set the memlock value higher than your SGA requirements.



可能因為沒有配置大頁記憶體導致的故障現象

1.       CPU100% ,但是 user% 不高,只是 sys% 非常高

2.       /proc/meminfo 顯示 PageTables 頁表非常大好幾個 G


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

相關文章