各平臺影響oracle Process數的引數(轉)

empo007發表於2007-02-11
名字描述n合理取值
SHMMAX最大共享記憶體段尺寸(位元組)512 kB + 8192 * 緩衝區數 + 額外 ... 無窮大
SHMMIN最小共享記憶體段尺寸(位元組)1 (最多大約是 256 kB)
SHMSEG每程式最大共享記憶體段數量只需要 1 個段,不過預設比這高得多.
SHMMNI系統範圍最大共享記憶體段數量類似 SHMSEG + 用於應用的空間
SEMMNI訊號燈識別符號的最小數量(也就是說,套)>= ceil(max_connections % 16)
SEMMNS系統範圍的最大訊號燈數量ceil(max_connections / 16) * 17 + 用於其他應用的空間
SEMMSL每套訊號燈最小訊號燈數量>= 17
SEMMAP訊號燈對映裡的記錄數量參閱文字
SEMVMX訊號燈的最大值>= 255 (預設通常是32767,除非被要求,否則不要修改
[@more@]

最重要的共享記憶體引數是 SHMMAX, 以位元組記的共享記憶體段可擁有的最大尺寸. 如果你收到來自shmget的一行Invalid argument 這樣的錯誤資訊,那麼很有可能是你超過限制了. 要求的共享記憶體段隨著請求的緩衝區數量(-B選項)和 允許的連線數量(-N選項)的變化而變化,儘管前者是 主要因素. (因此,作為一種臨時的解決方法,你可以降低這些設定來繞過失敗.) 如果粗略地估計,你可以估計所需要的段尺寸是緩衝區數量乘以塊 尺寸(預設 8192KB)加上足夠的盈餘(至少半兆位元組). 任何錯誤資訊都會包含分配失敗的尺寸.

不太可能出問題的是共享記憶體段的最小尺寸(SHMMIN), 對 Postgres來說最多是 256 kB左右(通常只是 1),而 系統範圍(SHMMNI)或每程式(SHMSEG) 最大共享記憶體段數量不應該會產生問題,除非你的系統把它們設成零. 有些系統還對系統裡的共享記憶體總量有限制;參閱下面平臺相關的指導.

Postgres 每個允許的聯接使用一個訊號燈 (-N選項), 以 16 個為一套.每套訊號燈還包含第十七個訊號燈, 它裡面一個“magic number(標誌數字)”, 以避免和其他應用使用的訊號燈集衝突. 系統裡的最大訊號燈數目是由SEMMNS設定的, 因此這個值應該至少和聯接設定一樣大,並且每十六個聯接還要另外加一個. (參閱 裡面的公式.) 引數SEMMNI決定 系統裡一次可以存在的訊號燈集的數目.因此這個引數至少應該為 ceil(max_connections % 16).降低允許的聯接數目是一個臨時的 繞開失敗的方法,這個啟動失敗通常被來自函式semget() 的錯誤響應 “No space left on device”搞得很讓人迷惑.

有時候你還會發現有必要增大SEMMAP,使之至少按照 SEMMNS配置.這個引數定義訊號燈資源對映的尺寸, 可用的每個連續的訊號燈塊在這個對映中存放一條記錄. 每當一套訊號燈被釋放,那麼它要麼會加入到該對映中一條相連的 已釋放的塊的入口中,要麼註冊成一條新的入口.如果對映填滿了碎片, 那麼被釋放的訊號燈就丟失了(除非重起).因此時間長訊號燈空間的碎片 了會導致可用的訊號燈比應該有的訊號燈少.

SEMMSL 引數,決定一套訊號燈裡可以有多少訊號燈,對於 Postgres而言應該至少是 17.

許多設定與 “semaphore undo(訊號燈恢復)”有關,比如 SEMMNUSEMUME,這些與 Postgres無關.

BSD/OS

共享記憶體. 預設時是隻支援 4MB 的共享記憶體.請記住共享記憶體是不能分頁的;它是 鎖在 RAM 裡面的.共享記憶體引數是:

#define SHMMAX		/* max shared memory segment size (bytes) */
#define SHMMIN		/* min shared memory segment size (bytes) */
#define SHMMNI		/* max number of shared memory identifiers */
#define SHMSEG		/* max shared memory segments per process */
#define SHMALL		/* max amount of shared memory (pages) */
要增加 postmaster 使用的緩衝區數量,向你的核心配置檔案裡增加下面 幾行.SHMALL 值為 1024 的時候代表 4MB 共享記憶體. 相應增加該值:
options "SHMALL=4096"
options "SHMMAX=(SHMALL*PAGE_SIZE)"

對於執行 4.1 或更新的版本的人,只需要編譯核心並重起.對於執行 更早的版本的,請用 bpatch 找出當前核心的 sysptsize值.它是啟動的時候自動計算的.

$ bpatch -r sysptsize
0x9 = 9
另外,把 SYSPTSIZE修改為一個硬程式碼值.用 bpatch 算出來的值,並且為你需要的每個額外的 4 MB 共享記憶體加 1.
options "SYSPTSIZE=13"
sysptsize不能用 sysctl 在執行時修改.

訊號燈. 你可能需要增加訊號燈的數量.預設時,Postgres 分配 34 個訊號燈.這個數量只是剛剛超過預設的系統總數 60 的一半.

預設值在/sys/sys/sem.h

#define SEMMNI  10              /* # of semaphore identifiers */

#define SEMMNS  60              /* # of semaphores in system */

#define SEMUME  10              /* max # of undo entries per process */

#define SEMMNU  30              /* # of undo structures in system */
在核心配置檔案裡設定你需要的值,比如:
options "SEMMNI=40"
options "SEMMNS=240"
options "SEMUME=40"
options "SEMMNU=120"

, OpenBSD

編譯核心時 需要把選項SYSVSHMSYSVSEM開啟. (預設是開啟的.) 共享記憶體的最大尺寸是由選項SHMMAXPGS(以頁計). 下面顯示了一個如何設定這些引數的例子:

options         SYSVSHM
options         SHMMAXPGS=4096
options         SHMSEG=256

options         SYSVSEM
options         SEMMNI=256
options         SEMMNS=512
options         SEMMNU=256
options         SEMMAP=256

HP-UX

預設設定看來對普通安裝是足夠的了. 在 HP-UX 10,SEMMNS的出廠預設是 128, 可能對大的資料庫節點來說太小了.

IPC 可以在 System Administration Manager(系統管理器) (SAM)下面的 Kernel ConfigurationConfigurable Parameters 配置. 你配置完了以後敲 Create A New Kernel選項.

在 2.2 核心裡預設的共享記憶體限制( SHMMAXSHMALL)都是 32 MB,但是你可以在 proc 檔案系統裡修改這些值(不用重起). 比如,要允許 128 MB:

$ echo 134217728 >/proc/sys/kernel/shmall
$ echo 134217728 >/proc/sys/kernel/shmmax
你可以把這些命令放到一個引導時執行的指令碼中.

另外,如果你的系統裡有的話,你可以使用 sysctl(8) 來控制這些引數. 查詢一個叫 /etc/sysctl.conf 的檔案,然後再它裡面加下面 這樣的幾行:

kernel.shmall = 134217728
kernel.shmmax = 134217728
通常在引導的時候會處理這個檔案, 但你也可以稍後明確呼叫 sysctl

其他引數對任何應用來說都足夠了. 如果你想自己檢視,你可以看看下面幾個檔案: /usr/src/linux/include/asm-xxx/shmparam.h/usr/src/linux/include/linux/sem.h.

SCO OpenServer

預設配置時,只允許每段 512KB 共享記憶體,大概只夠 -B 24 -N 12用的.要增大設定,首先進入 /etc/conf/cf.d目錄.要顯示當前的以位元組記的 SHMMAX,執行

./configure -y SHMMAX
設定 SHMMAX的新值:
./configure SHMMAX=value
這裡 value 是你想設定的以位元組記的新值. 設定完了以後SHMMAX重新制作核心
./link_unix
然後重起.

至少到版本 2.6 為止,共享記憶體段的引數設定對Postgres 來說是太低了.相關的設定可以在/etc/system裡面修改, 例如:

set shmsys:shminfo_shmmax=0x2000000
set shmsys:shminfo_shmmin=1
set shmsys:shminfo_shmmni=256
set shmsys:shminfo_shmseg=256

set semsys:seminfo_semmap=256
set semsys:seminfo_semmni=512
set semsys:seminfo_semmns=512
set semsys:seminfo_semmsl=32
你要重起系統令修改生效.

又見 獲取關於 Solaris 裡面的共享記憶體的資訊.

UnixWare

UnixWare 7 上,預設配置裡的最大共享記憶體段是 512 kB. 這個數只夠-B 24 -N 12用的.要顯示SHMMAX的 當前值,執行

/etc/conf/bin/idtune -g SHMMAX
就會顯示以位元組記的當前的預設的最小和最大值. 要給SHMMAX設定一個新值,執行:
/etc/conf/bin/idtune SHMMAX value
這裡 value是你想設定的以位元組記的新值. 設定完SHMMAX後,重建核心
/etc/conf/bin/idbuild -B
然後重起.

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

相關文章