Linux核心引數以及Oracle引數調整(updated)

tolywang發表於2008-06-23

.

[@more@]

我們一般在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 size of one shared memory segment. The SHMMAX setting should be large enough to hold the entire SGA in one shared memory segment. A low setting can cause creation of multiple shared memory segments which may lead to performance 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系統設定shmmax32Bit最大的限制值(setting shmmax to the 32-bit number limit),也就是4G

所以一般來說,1-4G的實體記憶體,可以直接設定shmmax為最大實體記憶體即可,那麼SGA肯定在一個共享記憶體段中,32Bit Linux系統實體記憶體大於4G 的設定為4G即可 。總之,一般設定shmmax >=SGA (32Bit系統是否支援到1.7G以上SGA需要注意)

如果是64BitLinux作業系統,shmmax 設定為大於SGA_MAX_SIZE即可。

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_SIZESGA_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

SHARED_POOL_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),控制這一特性的,就僅僅是這個引數SGA_TARGE。設定這個引數後,你就不需要為每個記憶體區來指定大小了。SGA_TARGET指定了SGA可以使用的最大記憶體大小,而SGA中各個記憶體的大小由Oracle自行控制,不需要人為指定。Oracle可以隨時調節各個區域的大小,使之達到系統效能最佳狀態的個最合理大小,並且控制他們之和在SGA_TARGET指定的值之內。一旦給SGA_TARGET指定值後(預設為0,即沒有啟動ASMM),就自動啟動了ASMM特性。

10g下設定 SGA_TARGET 之後啟動ASSM特性之後, 只有以下的這些區的記憶體大小動態共享起來:

* Buffer cache (DB_CACHE_SIZE)

* Shared pool (SHARED_POOL_SIZE)

* Large pool (LARGE_POOL_SIZE)

* Java pool (JAVA_POOL_SIZE)

* Streams pool (STREAMS_POOL_SIZE)

SGA中的其他區域的記憶體大小仍然是固定不共享的。


它的含義和SGA_MAX_SIZE的一樣,也表示SGA最大的大小,於是它也就有了一個限制,那就是它的大小不能大於SGA_MAX_SIZE的大小。Oracle10g下, SGA_MAX_SIZE仍然表示SGA的大小的上限值,而SGA_TARGET是SGA的所有元件的大小的最大值之和,即當SGA_TARGET< SGA_MAX_SIZE的時候,oracle就會忽略SGA_MAX_SIZE的值,SGA_TARGET也就成了SGA的在此例項中的上限制,它能動態改變大小,但是不能夠大於SGA_MAX_SIZE的值。

有人曾經做過試驗,在某些版本中(可能在我的版本之後的版本),當SGA_TARGET < SGA_MAX_SIZE時,例項重啟以後SGA_MAX_SIZE就變成SGA_TARGET的大小了。

在11g中,這個SGA_TARGET只能設定是等於SGA_MAX_SIZE的大小了,設定比它小,oracle會自動幫你調整,設定比它大,那還是出錯。現在可以自己想想,oracle對SGA_TARGET的大小處理在往正確的簡單的方向前進中。

SGA_TARGET帶來一個重要的好處就是,能使SGA的利用率達到最佳,從而節省記憶體成本。因為ASMM啟動後,Oracle會自動根據需要調整各個區域的大小,大大減少了某些區域記憶體緊張,而某些區域又有記憶體空閒的矛盾情況出現。

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

相關文章