我們一般在Linux 上安裝設定Oracle資料庫或者在更換或升級硬體的時候都需要配置Linux 系統的核心參數, 然後才是調整Oracle 系統參數 。具體這些參數的實質意義是什麼,為什麼要做調整,如何合理調整。 帶著這些問題我們做以下的一些分析以及測試。 注意: 以下的一些測試可能只適用於Linux 系統,且測試Linux 系統為64Bit,32Bit Linux 系統可能有不一樣 。
測試環境: Linux AS 4.0 U5 64Bit
核心版本: 2.6.9-55.ELsmp #1 SMP x86_64
1. Linux 系統下的核心參數:
[root@ECSDB etc]# cat sysctl.conf 或者到 /proc/sys/kernel 下查看。
kernel.shmall = 2097152
kernel.shmmax = 8405194752
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
fs.file-max = 65536
fs.file-max = 65536
net.ipv4.ip_local_port_range = 1024 65000
net.core.rmem_default = 262144
net.core.rmem_max = 262144
net.core.wmem_default = 262144
net.core.wmem_max = 262144
----- 小技巧: 修改 /etc/sysctl.conf 檔案之後立刻生效命令
# sysctl -p
2. Linux 下核心參數調整
kernel.shmmax ----SHMMAX Available physical memory Defines the maximum allowable sizeof one shared memory segment. The SHMMAX setting should be large enoughto hold the entire SGA in one shared memory segment. A low setting cancause creation of multiple shared memory segments which may lead toperformance degradation.
Shmmax 是核心參數中最重要的參數之一,用於定義單個共用記憶體段的最大值,
shmmax 設定應該足夠大,能在一個共用記憶體段下容納下整個的SGA ,設定的過低可能會
導致需要建立多個共用記憶體段,這樣可能導致系統效能的下降。
http://www.itpub.net/showthread.php?threadid=551229&pagenumber
論壇上的一些說法: SHMMAX 僅僅是在共用記憶體段被建立的時候用來比較的一個數字,當共用記憶體段被一個進程(Process)建立,作業系統檢查是否被要求的共用記憶體段的值大於shmmax 的值 ,如果是,那麼將會拋出一個錯誤。這個時候系統會建立另外的一個或多個共用記憶體段滿足進程的需求。一般來說,共用記憶體段個數和系統效能沒有太直接的關係,也不會對效能產生太大的影響。
Steve Adams 在他的小冊子中說過,在執行個體啟動以及Server Process 建立的時候,多個小的共用記憶體段可能會導致當時輕微的系統效能的降低(在啟動的時候 需要去建立多個虛擬位址段,在進程建立的時候要讓進程對多個段進行“識別”,會有一些影響),但是其他時候都不會有影響。這意味著如果你的程式不是經常Create Processes(以及Destroy Them),效能方面就不是考慮的問題。
當然Oralce 的建議是希望一個大的共用記憶體段能容納整個SGA,這樣在任何時候都不會有甚至輕微的效能下降的隱患。Oracle 安裝文檔建議 32Bit Linux 系統設定shmmax 為32Bit 最大的限制值(setting shmmax to the 32-bit number limit),也就是4G 。
所以一般來說,1-4G 的實體記憶體,可以直接設定shmmax 為最大實體記憶體即可,那麼SGA 肯定在一個共用記憶體段中,32Bit Linux 系統實體記憶體大於4G 的設定為4G 即可 。
總之,一般設定shmmax >=SGA (32Bit 系統是否支援到1.7G 以上SGA 需要注意) 。如果是64Bit 的Linux 作業系統,shmmax 設定為大於SGA_MAX_SIZE 即可。
(僅供參考)
http://download-west.oracle.com/docs/html/A96167_01/pre.htm#CHDHDABJ
http://www.itpub.net/551203,1.html
Ipcs -sa 可以看到共用記憶體段個數
kernel.shmall ----kernel.shmall 參數是控制共用記憶體頁數 。Linux 共用記憶體頁大小為4KB, 共用記憶體段的大小都是共用記憶體頁大小的整數倍。一個共用記憶體段的最大大小是16G,那麼需要共用記憶體頁數是16GB/4KB=16777216KB/4KB=4194304 (頁),也就是64Bit 系統下16GB 實體記憶體,設定 kernel.shmall = 4194304 才符合要求(幾乎是原來設定2097152的兩倍)。這時可以將shmmax 參數調整到 16G 了,同時可以修改SGA_MAX_SIZE 和SGA_TARGET 為 12G(您想設定的SGA 最大大小,當然也可以是2G~14G 等,還要協調PGA參數及OS 等其他記憶體使用量,不能設定太滿,比如16G)。
kernel.shmmni ----shmmni 核心參數是共用記憶體段的最大數量(注意這個參數不是 shmmin,是shmmni, shmmin 表示記憶體段最小大小 ) 。shmmni 預設值 4096 ,一般肯定是夠用了 。
3. Oracle 下需要做調整的參數
SGA_MAX_SIZE
SGA_TARGET
DB_CACHE_SIZE
SGA_MAX_SZIE 為執行個體允許使用的sga 上限,一個靜態參數,是不能動態修改的.
SGA_TARGET 為10g 推出的sga 自動管理的參數,動態參數,可以動態修改.
sga_max_size 與 SGA 各組件大小的關係
設定的 sga_max_size 小於實際的SGA 中各個pool 的尺寸總和的大小,那麼
sga_max_size 的值會被oracle 自動以實際的SGA 的總尺寸代替。如果不設定
sga_max_size ,oracle 會自動的以實際的SGA 的總尺寸來設定sga_max_size 的值。
設定 sga_max_size 的值為大於SGA 中各個pool 的尺寸總和的值:但是
sga_max_size 的值相對於所有可用的實體記憶體來說,是一個合理的值。sga_max_size的實際的值和pfile 中的sga_max_size 指定的值是一樣的。
在Oracle 10g 中引入了一個非常重要的參數:SGA_TARGET,這也是Oracle 10g
的一個新特性。自動共用記憶體管理(Automatic Shared Memory Management ASMM