linux系統基於oracle的核心引數配置說明

datapeng發表於2014-09-18
    當前linux使用越來越頻繁,並且很多核心的業務都開始轉移到linux上面。linux對於oracle的支援是比較好的,現在就oracle在linux上面的一些引數調整進行說明

1. Linux 系統下的核心引數:
[root@ECSDB etc]# cat sysctl.conf 或者到 /proc/sys/kernel 下檢視。
kernel.shmall = 2097152
kernel.shmmax = 8405194752          一般配置為實體記憶體50%,如果記憶體很大,可以增加,表示共享記憶體最大值      
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
建議設定:250 32000 100 128
 第一列,表示每個訊號集中的最大訊號量數目。
 第二列,表示系統範圍內的最大訊號量總數目。
 第三列,表示每個訊號發生時的最大系統運算元目。
 第四列,表示系統範圍內的最大訊號集總數目。
 所以,(第一列)*(第四列)=(第二列)
 以上設定,可以透過執行ipcs -l來驗證。
fs.file-max = 65536
fs.file-max = 65536該檔案用於控制核心訊號量,訊號量是System VIPC用於程式間通訊的方法。
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   
vm.min_free_kbytes = 102400     --系統最低保留記憶體
----- 小技巧: 修改 /etc/sysctl.conf 檔案之後立刻生效命令 # sysctl -p

2. 基於大頁面技術的引數:
vm.nr_hugepages = 143360
vm.swappiness=10                 --第二個引數是使用記憶體到90的時候,開始使用交換分割槽
這個可以根據計算得出,通常huge page的一個塊是2m,如下:
[root@mytest1 ~]# cat /proc/meminfo | grep -i huge
AnonHugePages:    884736 kB
HugePages_Total:   143360
HugePages_Free:    93966
HugePages_Rsvd:     5217
HugePages_Surp:        0
Hugepagesize:       2048 kB

這說明,在linux系統上所有的sga加起來,不能大於143360*2048KB
同時,需要在/etc/security/limits.conf
oracle   soft   memlock    293601280
oracle   hard   memlock    293601280
這兩個設定,表示oracle最大的鎖定記憶體,如果不設,後臺會報錯,單位為KB


3. Linux 下核心引數調整
  kernel.shmmax ----
      Shmmax 是核心引數中最重要的引數之一,用於定義單個共享記憶體段的最大值,shmmax 設定應該足夠大,能在一個共享記憶體段下容納下整個的SGA ,設定的過低可能會導致需要建立多個共享記憶體段,這樣可能導致系統效能的下降 。
      論壇上的一些說法: 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 即可。 (僅供參考)
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),控制這一特性的,就僅僅是這個引數SGA_TARGE。設定這個引數後,你就不需要為每個記憶體區來指定大小了。SGA_TARGET 指定了SGA 可以使用的最大記憶體大小,而SGA 中各個記憶體的大小由Oracle 自行控制,不需要人為指定。Oracle 可以隨時調節各個區域的大小,使之達到系統效能最佳狀態的個最合理大小,並且控制他們之和在SGA_TARGET 指定的值之內。一旦給SGA_TARGET 指定值後(預設為0,即沒有啟動ASMM),就自動啟動了ASMM特性。
10g、11g 下設定 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/29371470/viewspace-1272786/,如需轉載,請註明出處,否則將追究法律責任。

相關文章