1. 程式人生 > >修改linux共享記憶體大小

修改linux共享記憶體大小

這是實際linux系統顯示的實際資料:

[email protected]:/proc/sys/kernel$ cat shmmax 

33554432

[email protected]:/proc/sys/kernel$ cat shmmni

4096

[email protected]:/proc/sys/kernel$ cat msgmax

8192

[email protected]:/proc/sys/kernel$ cat msgmni

622

[email protected]:/proc/sys/kernel$ cat msgmnb

16384

System V

 IPC 引數

名字 描述 合理取值
SHMMAX 最大共享記憶體段尺寸(位元組) 最少若干兆(見文字)
SHMMIN 最小共享記憶體段尺寸(位元組) 1
SHMALL 可用共享記憶體的總數量(位元組或者頁面) 如果是位元組,就和 SHMMAX 一樣;如果是頁面,ceil(SHMMAX/PAGE_SIZE)
SHMSEG 每程序最大共享記憶體段數量 只需要 1 個段,不過預設比這高得多。
SHMMNI 系統範圍最大共享記憶體段數量 類似 SHMSEG 加上用於其他應用的空間
SEMMNI 訊號燈識別符號的最小數量(也就是說,套) 至少ceil(max_connections / 16)
SEMMNS
系統範圍的最大訊號燈數量 ceil(max_connections / 16) * 17 加上用於其他應用的空間
SEMMSL 每套訊號燈最小訊號燈數量 至少 17
SEMMAP 訊號燈對映裡的記錄數量 參閱文字
SEMVMX 訊號燈的最大值 至少 1000 (預設通常是32767,除非被迫,否則不要修改)

最重要的共享記憶體引數是 SHMMAX , 以位元組記的共享記憶體段可擁有的最大尺寸。如果你收到來自shmget 的類似Invalid argument 這樣的錯誤資訊,那麼很有可能是你超過限制了。

有些系統對系統裡面共享記憶體的總數(SHMALL )還有限制。 請注意這個數值必須足夠大。(注意:SHMALL

 在很多系統上是用頁面數,而不是位元組數來計算的。)

系統裡的最大訊號燈數目是由SEMMNS 設定的,因此這個值應該至少和 max_connections 設定一樣大,並且每十六個聯接還要另外加一個。  引數SEMMNI 決定系統裡一次可以存在的訊號燈集的數目。 因此這個引數至少應該為 ceil(max_connections % 16) 。降低允許的聯接數目是一個臨時的繞開失敗的方法,這個啟動失敗通常被來自函式semget 的錯誤響應 No space left on device 搞得很讓人迷惑。

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

SEMMSL 引數,決定一套訊號燈裡可以有多少訊號燈,

更改方法

Linux

預設設定只適合小安裝(預設最大共享記憶體是 32 MB)。不過,其它的預設值都相當大,通常不需要改變。最大的共享記憶體段設定可以用 sysctl 介面設定。 比如,要允許 128 MB,並且最大的總共享記憶體數為 2097152 頁(預設):

$

 sysctl -w kernel.shmmax=134217728



$

 sysctl -w kernel.shmall=2097152

你可以把這些設定放到 /etc/sysctl.conf 裡,在重啟後保持有效。

老版本里可能沒有 sysctl 程式,但是同樣的改變可以通過操作 /proc 檔案系統來做:

$

 echo 134217728 >/proc/sys/kernel/shmmax



$

 echo 2097152 >/proc/sys/kernel/shmall

另外可行的方法:
修改方法如下:修改/etc/rc.d/rc.local檔案

在檔案的前面註釋的後面加入以下行:

#修改核心共享記憶體大小;

echo134217728>/proc/sys/kernel/shmmax;

#說明:這裡的值為記憶體的一半;

#如果系統記憶體是256M,則值為134217728;

#如果系統記憶體是512M,則值為268435456;

修改完成以後,重起機器就搞定。

其它系統的修改方法

MacOS X

在 OS X 10.2 以及更造版本里, 編輯檔案 /System/Library/StartupItems/SystemTuning/SystemTuning 並且用下列命令修改這些數值:

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 裡面去了,必須在那裡編輯。你需要重新啟動才能讓設定生效。請注意/etc/rc 通常會被 OS X 更新覆蓋 (比如 10.3.6 到 10.3.7),所以每次更新後你可能都需要重新編輯。

在這個平臺上,SHMALL 是用 4KB 頁來度量的。 還要注意有些版本的 OS X 將拒絕把 SHMMAX 的數值數值為非 4096 的倍數。

SCO OpenServer

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

./configure -y SHMMAX

設定 SHMMAX 的新值:

./configure SHMMAX=value



這裡 value 是你想設定的以位元組記的新值。設定完了以後SHMMAX 重新制作核心

./link_unix

然後重起。

AIX

至少對於版本 5.1 而言,我們有必要為類似 SHMMAX 這樣的引數做特殊的配置,因為這個引數可以配置為所有內容都當作共享記憶體使用。這就是類似 DB/2 這樣的資料庫常用的配置。

不過,我們可能有必要在 /etc/security/limits 裡面修改全域性 ulimit ulimit 資訊,因為檔案大小的預設硬限制(fsize )以及檔案數(nofiles )可能太低了。

Solaris

至少到版本 2.6 為止,共享記憶體段的預設最大設定對 PostgreSQL 來說是太低了。相關的設定可以在/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

你要重起系統令修改生效。

UnixWare

在 UnixWare 7 上,預設配置裡的最大共享記憶體段是 512 kB。 要顯示SHMMAX 的當前值,執行

/etc/conf/bin/idtune -g SHMMAX

就會顯示以位元組記的當前的預設的最小和最大值。 要給SHMMAX 設 置一個新值,執行:

/etc/conf/bin/idtune SHMMAX value



這裡 value 是你想設定的以位元組記的新值。設定完SHMMAX 後,重建核心

/etc/conf/bin/idbuild -B

然後重起。

BSD/OS

共享記憶體. 預設時是隻支援 4 MB 的共享記憶體。請記住共享記憶體是不能分頁的;它是鎖在 RAM 裡面的。要增加你的系統支援的共享緩衝區數目,向你的核心配置檔案裡增加下面的行:

options "SHMALL=8192"

options "SHMMAX=\(SHMALL*PAGE_SIZE\)"

SHMALL 以 4KB 頁為單位計算,所以 1024 頁面代表 4 M 共享記憶體。 所以上面的東西把共享記憶體區域增加到 32 MB。 對於執行 4.3 或者更新版本的人,你可能需要增大 KERNEL_VIRTUAL_MB ,超過預設的 248 。 做完上面的修改之後,然後編譯核心並重起。

對於執行 4.0 或者更早的版本的, 請用 bpatch 找出當前核心的 sysptsize 值。它是啟動的時候動態計算的。

$ bpatch -r sysptsize



0x9 = 9

然後,把 SYSPTSIZE 修改為在核心配置檔案裡的一個硬程式碼值。用 bpatch 算出來的值,並且為你需要的每個額外的 4 MB 共享記憶體再加 1。

options "SYSPTSIZE=16"

sysptsize 不能用 sysctl 修改。

訊號燈. 你可能還需要增加訊號燈的數量;系統預設的總數 60 只能允許大概 50 個 PostgreSQL 連線。在核心配置檔案裡設定你需要的值,比如:

options "SEMMNI=40"

options "SEMMNS=240"
FreeBSD

預設設定只適合於很小的安裝(比如,預設 SHMMAX 是 32 MB)。我們可以用 sysctl 或者 loader 介面來修改。下面的引數可以用 sysctl 設定:

$

 sysctl -w kern.ipc.shmall=32768



$

 sysctl -w kern.ipc.shmmax=134217728



$

 sysctl -w kern.ipc.semmap=256

要想讓這些設定重啟後有效,修改 /etc/sysctl.conf 。

如果用 sysctl ,那麼剩下的訊號燈設定是隻讀的,但是訊號燈可以在啟動的時候,在 loader 提示符下設定:

(loader)

 set kern.ipc.semmni=256



(loader)

 set kern.ipc.semmns=512



(loader)

 set kern.ipc.semmnu=256

類似的,這些東西可以在 /boot/loader.conf 中儲存,以便重啟之後依然有效。

你可能還想配置核心,讓把共享記憶體裝載到 RAM 裡,避免他們被交換到交換分割槽中。這些可以通過使用 sysctl 設定kern.ipc.shm_use_phys 來實現。

在 4.0 之前的 FreeBSD 版本類似 NetBSD 和 OpenBSD (見下文)。

NetBSD 
OpenBSD

編譯核心時需要把選項 SYSVSHM 和 SYSVSEM 開啟。(預設是開啟的。)共享記憶體的最大尺寸是由選項SHMMAXPGS (以頁計)。下面顯示了一個如何設定這些引數的例子(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 設定將共享記憶體鎖在 RAM 中以避免它們被交換出去,我們可以用 sysctl 設定kern.ipc.shm_use_phys 來實現這個目的。

HP-UX

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

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

相關推薦

修改linux共享記憶體大小

這是實際linux系統顯示的實際資料: [email protected]:/proc/sys/kernel$ cat shmmax  33554432 [email protected]:/proc/sys/kernel$ cat shmmni

Linux:共享記憶體

概念: 共享記憶體區是最快的IPC形式。⼀一旦這樣的記憶體對映到共享它的程序的地址空間,這些程序間資料傳遞不再 涉及到核心,換句話說是程序不再通過執⾏行進⼊入核心的系統調⽤用來傳遞彼此的資料。 共享記憶體中的函式: shmget函式: 功能:⽤用來建立共享記

程序間通訊之Linux共享記憶體程式設計

共享記憶體 共享記憶體(Shared Memory)是指多個程序共享一段指定的記憶體空間進行資料互動,三種System V IPC機制(另外兩種是訊號量和訊息佇列)中共享記憶體是速度最快的一種。 共享記憶體機制是最快的一種程序間通訊(Interprocess Commun

Linux 程式設計1:深入淺出 Linux 共享記憶體

筆者最近在閱讀Aerospike 論文時,發現了Aerospike是利用了Linux 共享記憶體機制來實現的儲存索引快速重建的。這種方式比傳統利用索引檔案進行快速重啟的方式大大提高了效率。(減少了磁碟 i/o,但是缺點是耗費記憶體,並且伺服器一旦重啟之後就只能冷重啟了~~)而目前筆者工作之中維護的 No

(轉)Linux共享記憶體使用常見陷阱與分析(4)-共享記憶體刪除的陷阱

轉自http://os.51cto.com/art/201311/418977_3.htm 共享記憶體刪除的陷阱? 當程序結束使用共享記憶體區時,要通過函式 shmdt 斷開與共享記憶體區的連線。該函式宣告在 sys/shm.h 中,其原型如下: #include #

(轉)Linux共享記憶體使用常見陷阱與分析(3)-ftok是否一定會產生唯一的key值

轉自http://os.51cto.com/art/201311/418977_2.htm ftok是否一定會產生唯一的key值? 系統建立IPC通訊(如訊息佇列、共享記憶體時)必須指定一個ID值。通常情況下,該id值通過ftok函式得到。 ftok原型如下: ke

linux 共享記憶體 總結

 共享記憶體可以說是最有用的程序間通訊方式,也是最快的IPC形式。兩個不同程序A、B共享記憶體的意思是,同一塊實體記憶體被對映到程序A、B各自的程序地址空間。程序A可以即時看到程序B對共享記憶體中資料的更新,反之亦然。由於多個程序共享同一塊記憶體區域,必然需要某種同步機制,

Linux 共享記憶體 .

一、概念 共享記憶體是被多個程序共享的一部分實體記憶體,是程序間共享資料的最快的一種方法。 二、實現 分為兩個步驟: 1、建立共享記憶體。 2、對映共享記憶體。 1、建立   int shmget(key_t key, int size, int shmflg

linux 共享記憶體(shmget,shmat,shmdt,shmctl)解析

shmget int shmget(key_t key, size_t size, int shmflg); key:     識別符號的規則 size:    共享儲存段的位元組數 flag:    讀寫的許可權還有IPC_CREAT或IPC_EXCL對應檔案的O_CREAT或O_EXCL 返回值: 

CENTOS LINUX查詢記憶體大小、頻率

more /proc/meminfo dmidecode [[email protected] ~]# dmidecode -t memory linux下檢視主機板記憶體槽與記憶體資訊 1、檢視記憶體槽數、那個槽位插了記憶體,大小是多少 dmidecode|grep -P -A5 "Memory

Linux共享記憶體與互斥鎖

Linux共享記憶體 共享記憶體是從系統的空閒記憶體池中分配,並希望訪問它的每個程序都能連線它。連線的過程稱為對映。對映後,每個程序都可通過訪問自己的記憶體而訪問共享記憶體區域,進而與其它程序進行通訊。 共享記憶體相關函式 開啟建立共享記憶體檔案 int shm_op

java.lang.OutOfMemoryError: PermGen space的問題及修改JVM的記憶體大小方法

今天做專案時突然遇到這樣的問題,在網上搜到這樣解決方法,轉載供大家參考 PermGen space的全稱是Permanent Generation space,是指記憶體的永久儲存區域OutOfMemoryError: PermGen space從表面上看就是記憶體益出,解

Linux共享記憶體物件,shm_open,mmap

Linux共享記憶體物件 概述 linux下,每個程序都有自己擁有的記憶體區域,程序的記憶體總是私有的。共享記憶體是從系統的空閒記憶體池中分配的,希望訪問它的每個程序連線它。這個連線過程稱為對映。對映後,每個程序都可通過訪問自己的記憶體而訪問共享記憶體區域,

Linux共享記憶體和cache

申請以下共享記憶體,不對其進行初始化,共享記憶體大小為56600032bytes:  此時free:             total       used       free     shared    buffers     cachedMem:       3932

修改ActiveMQ的記憶體大小

有時我們需要修改ActiveMQ的記憶體大小,防止記憶體溢位! 修改配置檔案下-Xmx引數然後重啟mq即可: /fs01/apache-activemq-5.15.0/bin/env ACTIVEMQ_OPTS_MEMORY="-Xms64M -Xmx2G" JVM:檢視java記憶體

Linux修改TomcatJVM記憶體大小

要新增在tomcat 的bin 下catalina.sh 裡,位置cygwin=false前 。注意引號要帶上,JAVA_OPTS這行為新新增的. # OS specific support. $v

Linux-程序通訊-訊息佇列/訊號燈/共享記憶體

訊息佇列     訊息佇列提供了程序間傳送資料塊的方法,每個資料塊都可以被認為是有一個型別,接受者接受的資料塊可以有不同的型別;我們可以通過傳送訊息來避免命名管道的同步和阻塞問題;訊息佇列與命名管道一樣,每個資料塊都有一個最大長度的限制;我們可以將每個資料塊當作是一

c/c++ linux 程序間通訊系列4,使用共享記憶體

linux 程序間通訊系列4,使用共享記憶體 1,建立共享記憶體,用到的函式shmget, shmat, shmdt 函式名 功能描述 shmget 建立共享記憶體,返回pic key

Linux下檢視檔案和資料夾佔用記憶體大小、刪除日誌 命令

轉:https://www.cnblogs.com/lixuwu/p/5944062.html 閱讀目錄 1 Linux下檢視檔案和資料夾大小 2 刪除系統日誌等 3 實踐 場景:在sts中執行自動部署時候maven提示No space left on d

Linux:程序間通訊(匿名管道命名管道)(共享記憶體,訊息佇列,訊號量)

目錄 程序間通訊的介紹 管道 匿名管道 原理: 程式碼實現 匿名管道特性 實現管道符 |  命名管道 命名管道特性 程式碼實現 管道讀寫規則 作業系統中ipc的相關命令 共享記憶體(重點) 生命週期: 程式碼實現 程式碼實現獲