ORACLE與hugepage(一)

wei-xh發表於2013-11-27

以下的內容是基於32位的系統,4K的記憶體頁大小做出的計算
1)目錄表,用來存放頁表的位置,共包含1024個目錄entry,每個目錄entry指向一個頁表位置,每個目錄entry,4b大小,目錄表共4b*1024=4K大小
2)頁表,用來存放實體地址頁的起始地址,每個頁表entry也是4b大小,每個頁表共1024個頁表entry,因此一個頁表的大小也是4K,共1024個頁表,因此頁表的最大大小是1024*4K=4M大小
3)每個頁表entry指向的是4K的實體記憶體頁,因此頁表一共可以指向的實體記憶體大小為:1024(頁表數)*1024(每個頁表的entry數)*4K(一個頁表entry代表的頁大小)=4G
4)作業系統將虛擬地址對映為實體地址時,將虛擬地址的31-22這10位用於從目錄表中索引到1024個頁表中的一個,將虛擬地址的12-21這10位用於從頁表中索引到1024個頁表entry中的一個。從這個頁表entry中獲得實體記憶體頁的起始地址,然後將虛擬地址的0-12位用作4KB記憶體頁中的偏移量,那麼實體記憶體頁起始地址加上偏移量就是進出所需要訪問的實體記憶體地址。

由於32位作業系統不會出現4M的頁表,因為一個程式不能使用到4GB的記憶體空間,有些空間被保留使用,比如用來做作業系統核心的記憶體。而且頁表entry的建立出現在程式訪問到一塊記憶體的時候,而不是一開始就建立。

在32位系統下,一個程式訪問1GB的記憶體,會產生1M的頁表,如果是在64位系統,將會增大到2M。
很容易推算,如果一個SGA設定為60G,有1500個ORACLE使用者程式,64位LINUX的系統上,最大的頁表佔用記憶體為:60*2*1500/1024=175G,是的,你沒看錯,是175G!

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

相關文章