天天看點

《Oracle高性能自動化運維》一一1.4 Linux記憶體體系與Oracle記憶體空間

1.4 linux記憶體體系與oracle記憶體空間

1.4.1 linux使用者空間與核心空間

一般來說,linux作業系統把虛拟位址空間劃分為使用者空間和核心空間。例如x86架構下的32位linux虛拟位址空間是4gb(0x0000 0000~0xffff ffff),其中大緻将前3gb(0x0000 0000~0xbfff ffff)劃分為使用者空間,後1gb(0xc000 0000~0xffff ffff)劃分為核心空間。

使用者程式隻能在使用者模式(使用者空間)下執行,而不能通路特權模式(核心空間)的資料,也不能跳轉到核心代碼執行,這樣的設計可以保護核心,最主要的原因是當一個使用者程序通路了非法位址,最壞的情況是該程序崩潰,而不會影響到核心和其他程序正常運作。

cpu在産生中斷或異常時會自動切換模式,由使用者模式切換到特權模式,這時就可以允許跳轉到核心代碼中執行中斷或異常服務程式。事實上,所有核心代碼的執行都是從中斷或異常服務程式開始的,整個linux核心就是由各種中斷處理和異常處理程式組成的。

《Oracle高性能自動化運維》一一1.4 Linux記憶體體系與Oracle記憶體空間

linux下的oracle記憶體配置設定如圖1-3、圖1-4所示。

oracle10g中的sga與pga在linux中是獨立配置設定的,但是在11g中,預設情況下sga記憶體區域包含了pga的記憶體空間。

1.4.2 linux下的oracle記憶體體系結構

我們知道,oracle主要是由記憶體結構和實體結構組成的,如圖1-5所示。

《Oracle高性能自動化運維》一一1.4 Linux記憶體體系與Oracle記憶體空間

圖1-5 oracle體系結構

可以看出,oracle 記憶體結構存在于作業系統的使用者空間,是以我們在部署oracle前,就必須事先在linux作業系統層面配置好oracle記憶體位址空間,這樣才能成功地配置sga與pga,進而避免在安裝oracle的時候出現類似“ora-27102:out of memory”的錯誤。

1.4.3 linux下的oracle記憶體配置設定

oracle記憶體結構處于linux作業系統的使用者空間,是以需要通過設定linux作業系統核心參數來對oracle 記憶體進行配置設定。由于linux延續了systemv ipc以及後來的posix ipc通信标準,是以linux下的記憶體配置設定主要由以下參數決定,如表1-1所示。

《Oracle高性能自動化運維》一一1.4 Linux記憶體體系與Oracle記憶體空間

shmall在很多系統上是用頁面數而不是位元組數來計算的。對于一般的linux來說,page頁的大小一般為4096。

參數shmmax是oracle最重要的linux核心參數之一,該參數以位元組為機關限制單個共享記憶體段的最大值。與此同時,參數shmall用于限制共享記憶體總數(位元組或者page頁)。對于oracle而言,必須保證這個數值足夠大,建議值為超過資料庫共享記憶體與其他共享記憶體的總和。oracle官方文檔對linux參數限制描述如圖1-6所示。

《Oracle高性能自動化運維》一一1.4 Linux記憶體體系與Oracle記憶體空間

圖1-6 oracle官方linux核心參數

我們可以通過以下示例來驗證linux下的oracle(10g)記憶體配置設定:

1)檢視oracle sga與pga配置設定情況,如圖1-7所示。

2)檢視linux系統共享記憶體配置設定情況,如圖1-8所示。

可以看到,linux系統配置設定了3個共享記憶體段,每個共享記憶體段的大小為2gb。

3)檢視linux環境中的sysctl.conf配置,如圖1-9所示。

結合前面内容,不難看出:

單個共享記憶體段最大值為kernel.shmmax=2147483648b=2gb,與圖1-10一緻;

sga=3(共享記憶體段數量)×2gb(單個記憶體段最大值)=6gb;

pga=2gb;

linux共享記憶體大小=kernel.shmall=2097152×4096/1024/1024/1024=8gb=sga(6gb)+pga(2gb)。

《Oracle高性能自動化運維》一一1.4 Linux記憶體體系與Oracle記憶體空間

圖1-7 oracle sga與pga配置設定

《Oracle高性能自動化運維》一一1.4 Linux記憶體體系與Oracle記憶體空間

圖1-8 共享記憶體段

《Oracle高性能自動化運維》一一1.4 Linux記憶體體系與Oracle記憶體空間

圖1-9 sysctl.conf配置

上述内容可以概括如圖1-10所示。

結合前面内容,我們可以得出以下結論:

參數kernel.shmmax決定了單個共享記憶體段的最大值為2gb,即在linux作業系統層面能配置設定的單個共享記憶體段的最大值為2gb。如果所需共享記憶體大于該值,則需要配置設定多個共享記憶體段,以最大共享記憶體段(2gb)為門檻值對所需共享記憶體段進行拆分配置設定。

參數kernel.shmall(8gb)決定了linux作業系統能夠提供給oracle共享記憶體的上限值,sga與pga總和不能超過該門檻值。

《Oracle高性能自動化運維》一一1.4 Linux記憶體體系與Oracle記憶體空間

圖1-10 linux下的oracle記憶體配置設定(10g)

當sga_target設定為6gb時,kernel.shmmax(2gb)決定了linux系統配置設定的單個共享記憶體段上限值,是以需要配置設定3(6gb/2gb)個共享記憶體段來提供給sga。oracle推薦1個instance使用1個共享記憶體段,那麼當上述3個共享記憶體段被配置設定時,将會在共享記憶體段之間産生記憶體位址斷層(gap)。是以當資料庫進行ipc通信時,可能存在跨共享記憶體段的内部資料互動,這樣會降低共享記憶體段間的資料互動效率。是以,建議linux環境中的oracle使用1個共享記憶體段,這樣可以減少跨記憶體段的資料互動,進而提升資料庫性能。

圖1-10是以oracle 10g為例進行講解的,有興趣的讀者可以結合圖1-4對oracle11g進行擴充。