32位Linux設定超大Oracle SGA的分析

2021-07-22 17:49:59 字數 2815 閱讀 1021

一、核心版本的影響

在32位linux平台,至少都有兩套核心供使用者使用。乙個是smp核心,乙個是hugemem核心。兩個核心的區別在於直接對映的核心資料**位址空間的區別:

smp 核心:

在x86架構下,虛擬位址空間的大小為4g。在這4g空間中,使用者空間佔3g (0×00000000到0xbfffffff),核心空間佔1g(0xc0000000到0xffffffff)。這樣的分配策略稱為3g/1g分配。

具體的分配方式如下:

1. 0gb-1gb user space - used for text/code and brk/sbrk allocations (malloc uses brk for small chunks)

2. 1gb-3gb user space - used for shared libraries, shared memory, and stack; shared memory and malloc use mmap (malloc uses mmap for large chunks)

3. 3gb-4gb kernel space - used for the kernel itself

這種分配方式對於擁有1g物理記憶體以下的系統是沒有任何問題的,即使超過1g物理記憶體,3g/1g分配策略也沒有什麼問題,因為核心可以在高階記憶體區域 (實體地址1g以上的記憶體)中存放一些核心資料結構(比如頁緩衝等)。

然而,隨著物理記憶體的增多,3g/1g分配策略的問題也逐漸會暴露出來。這是因為一些關鍵的核心資料結構 (比如用於管理物理記憶體的mem_map) 是存放在1g核心空間之內的。對於32g記憶體的系統,mem_map會占用近 0.5g的低端記憶體(實體地址896m以下的記憶體),這樣留給核心其他部分的記憶體就不到所有記憶體的1.5%;而對於64g記憶體的系統,mem_map 本身就會耗盡所有的低端記憶體,造成系統無法啟動。但是把mem_map放到高階記憶體的做法也不太實際,因為mem_map和記憶體管理,體系結構相 關底層實現,檔案系統以及驅動等幾乎所有的核心的關鍵部分均有聯絡,這時候就需要使用hugemem核心了。

hugemem 核心:

與smp的3g/1g策略不同,hugemem 使用4g/4g分配方式。可以使核心空間由1g增加到4g,而使用者空間也由3g增加到4g。

相比3g/1g分配策略,對於4g物理記憶體系統,使用4g/4g分配可以增加低端記憶體達3倍以上,而對於32g物理記憶體系統,則會有更多的提公升,達 到原來的6倍。 理論上,4g/4g策略可以支援物理記憶體達200g的x86系統(如果硬體沒有限制的話),即使對於這樣的系統,4g/4g策略也能保證留有1g可用的低 端記憶體。

不論能否理解上面的解釋,只須要記住 smp 和 hugemem 兩個核心,乙個是 3g/1g策略,乙個是4g/4g策略即可。

二、oracle database 版本:

oracle sga 是掛載在記憶體使用者空間中,不同版本的 oracle database ,掛載sga起始位址是不同的:

oracle 10g release 1:掛載sga的起始位址為0×50000000(1.25gb)

oracle 10g release 2:掛載sga的起始位址為0×20000000(0.5gb)

(其它版本未查正,有興趣可以自已看看oracle手冊)

從這個結果可以看出,理論上若使用3g/1g的smp核心,oracle 10g release 1 的sga可設定到 3gb - 1.25 = 1.75gb 。正是因此,也有人認為oracle sga 只能設定到 1.75gb。而公升級至 r2 版本,則可以設定到 3gb - 0.5gb = 2.5gb 。相同的,使用 4g/4g 的hugemem 核心能夠獲得多大的sga 就很清楚了。

三、kernel shmmax 引數:

shmmax定義單個共享記憶體段的最大值,它的取值範圍區間是[0,4294967295], 單位為byte,4294967295 bytes即4294967296 bytes(4gb)減去1。一般來說,它應該足夠大以容下整個sga,避免sga使用多個共享記憶體段造成oracle效能下降。

那麼,將shmmax設定為最大值4294967295,使用 hugmemem 核心,oracle 10g r2 版本,則理論上的sga最大值為 3.5gb。

儘管使用者程序可用的虛擬位址空間為4gb以及shmmax的最大值為4294967295,仍然可以通過使用記憶體檔案系統(in-memory filesystem,比如tmpfs、ramfs以及hugetlbfs)開啟oracle的very large memory (vlm)特性來擴充套件sga超過4gb,比如6gb。但是這種方法有個不方便的地方是,使用者不能夠再使用oracle 10g中的automatic shared memory management了。

總結一下:

smp核心和hugemem核心的影響:

smp核心:1gb+3gb,sga最大值為1.75gb(3gb-1.25gb)

hugemem核心:4gb+4gb , sga最大值為2.75gb(4gb-1.25gb)

oracle 不同版本的影響:

oracle 10g release 1:掛載sga的起始位址為0×50000000(1.25gb)

oracle 10g release 2:掛載sga的起始位址為0×20000000(0.5gb)

那麼:hugemem 核心 + oracle 10g release 2 ,sga最大值為3.5gb(4gb-0.5gb)

btw:由於64位系統對應16eb定址範圍,而不是32位系統的4gb,所以想要獲得更大sga,效能更好的效果,應該優先使用 64 位系統,而不是通過32系統配合記憶體檔案系統來配置了。

Python設定32位環境

因為python的簡介性,之前用它寫了個程式用來公升級裝置。可是使用過程中有次使用者身邊的裝置是老舊的32位win7,暫時找不到64位的win使用,於是想重新打個32位的程式版本包,以防上述情況產生麻煩 python的環境管理軟體anaconda大名鼎鼎,不過一開始我也不太清楚我的問題是什麼 因為我...

linux 檢視系統 32位 or 64位

1.uname a 如果有x86 64就是64位的,沒有就是32位的 2.uname m x86 64 3.arch x86 64 4.file bin cat bin cat elf 64 bit lsb executable,amd x86 64,version 1 sysv for gnu l...

看linux是32位還是64位

1.uname a 如果有x86 64就是64位的,沒有就是32位的 這是64位的 uname a linux works 2.6.9 11.elsmp 1 smp fri may 20 18 25 30 edt 2005 x86 64 x86 64 x86 64 gnu linux 這是32位的 ...