linux共享内存变量 tiaojianbianliang,修改linux共享内存大小
這是實際linux系統(tǒng)顯示的實際數(shù)據(jù):
beijibing@bjb-desktop:/proc/sys/kernel$ cat shmmax
33554432
beijibing@bjb-desktop:/proc/sys/kernel$ cat shmmni
4096
beijibing@bjb-desktop:/proc/sys/kernel$ cat msgmax
8192
beijibing@bjb-desktop:/proc/sys/kernel$ cat msgmni
622
beijibing@bjb-desktop:/proc/sys/kernel$ cat msgmnb
16384
System V?IPC?參數(shù)
名字
描述
合理取值
SHMMAX
最大共享內(nèi)存段尺寸(字節(jié))
最少若干兆(見文本)
SHMMIN
最小共享內(nèi)存段尺寸(字節(jié))
1
SHMALL
可用共享內(nèi)存的總數(shù)量(字節(jié)或者頁面)
如果是字節(jié),就和?SHMMAX?一樣;如果是頁面,ceil(SHMMAX/PAGE_SIZE)
SHMSEG
每進程最大共享內(nèi)存段數(shù)量
只需要 1 個段,不過缺省比這高得多。
SHMMNI
系統(tǒng)范圍最大共享內(nèi)存段數(shù)量
類似?SHMSEG?加上用于其他應(yīng)用的空間
SEMMNI
信號燈標識符的最小數(shù)量(也就是說,套)
至少ceil(max_connections / 16)
SEMMNS
系統(tǒng)范圍的最大信號燈數(shù)量
ceil(max_connections / 16) * 17?加上用于其他應(yīng)用的空間
SEMMSL
每套信號燈最小信號燈數(shù)量
至少 17
SEMMAP
信號燈映射里的記錄數(shù)量
參閱文本
SEMVMX
信號燈的最大值
至少 1000 (缺省通常是32767,除非被迫,否則不要修改)
最重要的共享內(nèi)存參數(shù)是?SHMMAX?, 以字節(jié)記的共享內(nèi)存段可擁有的最大尺寸。如果你收到來自shmget?的類似Invalid argument?這樣的錯誤信息,那么很有可能是你超過限制了。
有些系統(tǒng)對系統(tǒng)里面共享內(nèi)存的總數(shù)(SHMALL?)還有限制。 請注意這個數(shù)值必須足夠大。(注意:SHMALL?在很多系統(tǒng)上是用頁面數(shù),而不是字節(jié)數(shù)來計算的。)
系統(tǒng)里的最大信號燈數(shù)目是由SEMMNS?設(shè)置的,因此這個值應(yīng)該至少和?max_connections?設(shè)置一樣大,并且每十六個聯(lián)接還要另外加一個。? 參數(shù)SEMMNI?決定系統(tǒng)里一次可以存在的信號燈集的數(shù)目。 因此這個參數(shù)至少應(yīng)該為?ceil(max_connections % 16)?。降低允許的聯(lián)接數(shù)目是一個臨時的繞開失敗的方法,這個啟動失敗通常被來自函數(shù)semget?的錯誤響應(yīng)?No space left on device?搞得很讓人迷惑。
有時候還可能有必要增大SEMMAP?,使之至少按照?SEMMNS?配置。這個參數(shù)定義信號燈資源映射的尺寸,可用的每個連續(xù)的信號燈塊在這個映射中存放一條記錄。每當一套信號燈被釋放,那么它要么會加入到該映射中一條相連的已釋放的塊的入口中,要么注冊成一條新的入口。如果映射填滿了碎片,那么被釋放的信號燈就丟失了(除非重起)。因此時間長信號燈空間的碎片了會導(dǎo)致可用的信號燈比應(yīng)該有的信號燈少。
SEMMSL?參數(shù),決定一套信號燈里可以有多少信號燈,
更改方法
Linux
缺省設(shè)置只適合小安裝(缺省最大共享內(nèi)存是 32 MB)。不過,其它的缺省值都相當大,通常不需要改變。最大的共享內(nèi)存段設(shè)置可以用?sysctl?接口設(shè)置。 比如,要允許 128 MB,并且最大的總共享內(nèi)存數(shù)為 2097152 頁(缺省):
$
sysctl -w kernel.shmmax=134217728
$
sysctl -w kernel.shmall=2097152
你可以把這些設(shè)置放到?/etc/sysctl.conf?里,在重啟后保持有效。
老版本里可能沒有?sysctl?程序,但是同樣的改變可以通過操作?/proc?文件系統(tǒng)來做:
$
echo 134217728 >/proc/sys/kernel/shmmax
$
echo 2097152 >/proc/sys/kernel/shmall
另外可行的方法:
修改方法如下:
修改/etc/rc.d/rc.local文件。
在文件的前面注釋的后面加入以下行:
#修改內(nèi)核共享內(nèi)存大小;
echo134217728>/proc/sys/kernel/shmmax;
#說明:這里的值為內(nèi)存的一半;
#如果系統(tǒng)內(nèi)存是256M,則值為134217728;
#如果系統(tǒng)內(nèi)存是512M,則值為268435456;
修改完成以后,重起機器就搞定。
其它系統(tǒng)的修改方法
MacOS X
在 OS X 10.2 以及更造版本里, 編輯文件?/System/Library/StartupItems/SystemTuning/SystemTuning?并且用下列命令修改這些數(shù)值:
sysctl -w kern.sysv.shmmax
sysctl -w kern.sysv.shmmin
sysctl -w kern.sysv.shmmni
sysctl -w kern.sysv.shmseg
sysctl -w kern.sysv.shmall
在 OS X 10.3 及以后的版本里,這些命令移動到?/etc/rc?里面去了,必須在那里編輯。你需要重新啟動才能讓設(shè)置生效。請注意/etc/rc?通常會被 OS X 更新覆蓋 (比如 10.3.6 到 10.3.7),所以每次更新后你可能都需要重新編輯。
在這個平臺上,SHMALL?是用 4KB 頁來度量的。 還要注意有些版本的 OS X 將拒絕把?SHMMAX?的數(shù)值數(shù)值為非 4096 的倍數(shù)。
SCO OpenServer
缺省配置時,只允許每段 512KB 共享內(nèi)存。 要增大設(shè)置,首先進入?/etc/conf/cf.d?目 錄。要顯示當前的以字節(jié)記的?SHMMAX?,運行
./configure -y SHMMAX
設(shè)置?SHMMAX?的新值:
./configure SHMMAX=value
這里?value?是你想設(shè)置的以字節(jié)記的新值。設(shè)置完了以后SHMMAX?重新制作內(nèi)核
./link_unix
然后重起。
AIX
至少對于版本 5.1 而言,我們有必要為類似?SHMMAX?這樣的參數(shù)做特殊的配置,因為這個參數(shù)可以配置為所有內(nèi)容都當作共享內(nèi)存使用。這就是類似?DB/2?這樣的數(shù)據(jù)庫常用的配置。
不過,我們可能有必要在?/etc/security/limits?里面修改全局?ulimit?ulimit?信息,因為文件大小的缺省硬限制(fsize?)以及文件數(shù)(nofiles?)可能太低了。
Solaris
至少到版本 2.6 為止,共享內(nèi)存段的缺省最大設(shè)置對?PostgreSQL?來說是太低了。相關(guān)的設(shè)置可以在/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
你要重起系統(tǒng)令修改生效。
又見?http://sunsite.uakom.sk/sunworldonline/swol-09-1997/swol-09-insidesolaris.html?獲取關(guān)于?Solaris?里面的共享內(nèi)存的信息。
UnixWare
在?UnixWare?7 上,缺省配置里的最大共享內(nèi)存段是 512 kB。 要顯示SHMMAX?的當前值,運行
/etc/conf/bin/idtune -g SHMMAX
就會顯示以字節(jié)記的當前的缺省的最小和最大值。 要給SHMMAX?設(shè) 置一個新值,運行:
/etc/conf/bin/idtune SHMMAX value
這里?value?是你想設(shè)置的以字節(jié)記的新值。設(shè)置完SHMMAX?后,重建內(nèi)核
/etc/conf/bin/idbuild -B
然后重起。
BSD/OS
共享內(nèi)存.缺省時是只支持 4 MB 的共享內(nèi)存。請記住共享內(nèi)存是不能分頁的;它是鎖在 RAM 里面的。要增加你的系統(tǒng)支持的共享緩沖區(qū)數(shù)目,向你的內(nèi)核配置文件里增加下面的行:
options "SHMALL=8192"
options "SHMMAX=\(SHMALL*PAGE_SIZE\)"
SHMALL?以 4KB 頁為單位計算,所以 1024 頁面代表 4 M 共享內(nèi)存。 所以上面的東西把共享內(nèi)存區(qū)域增加到 32 MB。 對于運行 4.3 或者更新版本的人,你可能需要增大?KERNEL_VIRTUAL_MB?,超過缺省的?248?。 做完上面的修改之后,然后編譯內(nèi)核并重起。
對于運行 4.0 或者更早的版本的, 請用?bpatch?找出當前內(nèi)核的?sysptsize?值。它是啟動的時候動態(tài)計算的。
$ bpatch -r sysptsize
0x9 = 9
然后,把?SYSPTSIZE?修改為在內(nèi)核配置文件里的一個硬代碼值。用?bpatch?算出來的值,并且為你需要的每個額外的 4 MB 共享內(nèi)存再加 1。
options "SYSPTSIZE=16"
sysptsize?不能用?sysctl?修改。
信號燈.你可能還需要增加信號燈的數(shù)量;系統(tǒng)缺省的總數(shù) 60 只能允許大概 50 個?PostgreSQL?連接。在內(nèi)核配置文件里設(shè)置你需要的值,比如:
options "SEMMNI=40"
options "SEMMNS=240"
FreeBSD
缺省設(shè)置只適合于很小的安裝(比如,缺省?SHMMAX?是 32 MB)。我們可以用?sysctl?或者?loader?接口來修改。下面的參數(shù)可以用?sysctl?設(shè)置:
$
sysctl -w kern.ipc.shmall=32768
$
sysctl -w kern.ipc.shmmax=134217728
$
sysctl -w kern.ipc.semmap=256
要想讓這些設(shè)置重啟后有效,修改?/etc/sysctl.conf?。
如果用?sysctl?,那么剩下的信號燈設(shè)置是只讀的,但是信號燈可以在啟動的時候,在?loader?提示符下設(shè)置:
(loader)
set kern.ipc.semmni=256
(loader)
set kern.ipc.semmns=512
(loader)
set kern.ipc.semmnu=256
類似的,這些東西可以在?/boot/loader.conf?中保存,以便重啟之后依然有效。
你可能還想配置內(nèi)核,讓把共享內(nèi)存裝載到 RAM 里,避免他們被交換到交換分區(qū)中。這些可以通過使用?sysctl?設(shè)置kern.ipc.shm_use_phys?來實現(xiàn)。
在 4.0 之前的?FreeBSD?版本類似?NetBSD?和?OpenBSD?(見下文)。
NetBSD
OpenBSD
編譯內(nèi)核時需要把選項?SYSVSHM?和?SYSVSEM?打開。(缺省是打開的。)共享內(nèi)存的最大尺寸是由選項SHMMAXPGS?(以頁計)。下面顯示了一個如何設(shè)置這些參數(shù)的例子(OpenBSD?使用的是?option?):
options SYSVSHM
options SHMMAXPGS=4096
options SHMSEG=256
options SYSVSEM
options SEMMNI=256
options SEMMNS=512
options SEMMNU=256
options SEMMAP=256
你可能原意使用?sysctl?設(shè)置將共享內(nèi)存鎖在 RAM 中以避免它們被交換出去,我們可以用?sysctl?設(shè)置kern.ipc.shm_use_phys?來實現(xiàn)這個目的。
HP-UX
缺省設(shè)置看來對普通安裝是足夠的了。 在?HP-UX?10,SEMMNS?的出廠缺省是 128,可能對大的數(shù)據(jù)庫節(jié)點來說太小了。
IPC?可以在?System Administration Manager(系統(tǒng)管理器)?(SAM?)下面的?Kernel Configuration?->Configurable Parameters?配置。你配置完了以后敲?Create A New Kernel?選項。
總結(jié)
以上是生活随笔為你收集整理的linux共享内存变量 tiaojianbianliang,修改linux共享内存大小的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux下编译build的命令,【li
- 下一篇: linux libvpx编译安装,lin