[20210826]核心引數kernel.sem.txt

lfree發表於2021-09-01

[20210826]核心引數kernel.sem.txt

kernel.sem = SEMMSL SEMMNS SEMOPM SEMMNI

where

semmsl:  The number of semaphores per set                                     每組訊號量
semmns:  The total number of semaphores available                             可用訊號量的總數
semopm:  The number of operations which can be made per semaphore call        每個訊號量呼叫可以執行的運算元。
semmni:  The maximum number of shared memory segments available in the system 系統中可用的最大共享記憶體段數
--//注:以上資訊出處我已經無法找到,不過semmni的解析應該不正確,這個引數的設定應該與訊號量相關,而不應該與最大共享記憶體段
--//有關係。

--//說句老實話,我對OS這方面知識瞭解很少,甚至不理解,安裝配置僅僅是照抄別人推薦的設定。
--//我記得我第一次安裝oracle 8i是在soalris伺服器,當時配置這些引數是就卡在那裡,不理解這些引數的具體含義,只能上新聞組問這
--//些問題。實際上你如果問現在許多安裝N多次oracle資料庫的人,基本也就是機械的copy and paste,具體表示什麼未必清楚。

--//首先轉抄連結:http://blog.itpub.net/26736162/viewspace-2147273/,並加入我對這些引數的理解。

重要的幾個引數如下所示:
kernel.shmall = 2097152
kernel.shmmax = 1054472192
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128

其含義分別如下所示:
(一)kernel.shmall = 2097152
# kernel.shmall引數是控制共享記憶體頁數。Linux 共享記憶體頁大小為4KB,共享記憶體段的大小都是共享記憶體頁大小的整數倍。如果一個共
# 享記憶體段的最大大小是16G,那麼需要共享記憶體頁數是 16GB/4KB = 16777216KB/4KB = 4194304(頁),也就是64Bit系統下16GB實體記憶體
# ,設定kernel.shmall = 4194304才符合要求(幾乎是原來設定2097152的兩倍)。簡言之,該引數的值始終應該至少為:
# ceil(SHMMAX/PAGE_SIZE)。這個值太小有可能導致資料庫啟動報錯(ORA-27102: out of memory)。

(二)kernel.shmmax = 1054472192  
# 定義一個記憶體段最大可以分配的記憶體空間,單位為位元組。如果定義太小,那麼會導致啟動例項失敗,或者SGA就會被分配到多個共享內
# 存段。那麼記憶體中的指標連線會給系統帶來一定的開銷,從而降低系統效能。這個值的設定應該大於SGA_MAX_TARGET或
# MEMORY_MAX_TARGET的值,最大值可以設定成大於或等於實際的實體記憶體。如果kernel.shmmax為100M,sga_max_size為500M,那麼啟動
# Oracle例項至少會分配5個共享記憶體段;如果設定kernel.shmmax為2G,sga_max_size為500M,那麼啟動Oracle例項只需要分配1個共享
# 記憶體段。

(三)kernel.shmmni = 4096
# 設定系統級最大共享記憶體段數量,該引數的預設值是4096。這一數值已經足夠,通常不需要更改。。

(四)kernel.sem = 250 32000 100 128
# 訊號燈的相關配置,訊號燈semaphores是程式或執行緒間訪問共享記憶體時提供同步的計數器。可以透過命令"cat /proc/sys/kernel/sem"
# 來檢視當前訊號燈的引數配置,如下所示:

# cat /proc/sys/kernel/sem
250     32000   100     128

其4個值的含義分別如下:
① 250表示SEMMSL,設定每個訊號燈組中訊號燈最大數量,推薦的最小值是250。對於系統中存在大量併發連線的系統,推薦將這個值設
   置為PROCESSES初始化引數加10。
--// 實際上對於linux 設定為PROCESSES初始化引數加4就可以了。
② 32000表示SEMMNS,設定系統中訊號燈的最大數量。作業系統在分配訊號燈時不會超過LEAST(SEMMNS,SEMMSL*SEMMNI)。事實上,如果
   SEMMNS的值超過了SEMMSL*SEMMNI是非法的,因此推薦SEMMNS的值就設定為SEMMSL*SEMMNI。Oracle推薦SEMMNS的設定不小於32000。
--//SEMMSL*SEMMNI=250*128 = 32000
③ 100表示SEMOPM,設定每次系統呼叫可以同時執行的最大訊號燈操作的數量。由於一個訊號燈組最多擁有SEMMSL個訊號燈,因此有推薦
   將SEMOPM設定為SEMMSL的值。Oracle驗證的10.2和11.1的SEMOPM的配置為100。
④ 128表示SEMMNI,設定系統中訊號燈組的最大數量。Oracle10g和11g的推薦值為142。
--//一直也不理解小麥苗為什麼推薦設定142,不知道出處再那裡,對引數SEMMNI的解析是設定系統中訊號燈組的最大數量。也就是最大
--//有128訊號組,感覺這個解析比較正確。

--//補充我測試環境的設定:
 $ cat /proc/sys/kernel/sem
2600    332800  2600    128

--//2600*128 = 332800
--//再次看了ipcs的文件,發現加入引數-ls 就可以檢視semaphore Limits。
$ ipcs -ls

------ Semaphore Limits --------
max number of arrays = 128
max semaphores per array = 2600
max semaphores system wide = 332800
max ops per semop call = 2600
semaphore max value = 32767

--//kernel.sem = SEMMSL SEMMNS SEMOPM SEMMNI,很明顯解析如下:
kernel.sem = SEMMSL SEMMNS SEMOPM SEMMNI

where

SEMMSL  max semaphores per array
SEMMNS  max semaphores system wide ,SEMMSL*SEMMNI=2600*128 = 332800
SEMOPM  max ops per semop call, SEMOPM=SEMMSL?
SEMMNI  max number of arrays
--//SEM 表示 Semaphore.
--//我想透過一些測試說明以上問題,加深理解,太長另外寫一篇blog

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

相關文章