linux IPC 訊息佇列 的核心限制

2022-04-10 13:58:03 字數 2253 閱讀 4488

**:

allocated queues = 0

used headers = 0

used space = 0 bytes

對於「ipcs -u」命令所顯示的ipc資源,如果要確定其限制,可以使用「ipcs -l」命令:

# ipcs -l

------ shared memory limits --------

max number of segments = 4096

max seg size (kbytes) = 32768

max total shared memory (kbytes) = 8388608

min seg size (bytes) = 1

------ semaphore limits --------

max number of arrays = 128

max semaphores per array = 250

max semaphores system wide = 32000

max ops per semop call = 32

semaphore max value = 32767

------ messages: limits --------

max queues system wide = 16

max size of message (bytes) = 8192

default max size of queue (bytes) = 16384

上述輸出表明,該系統已經到達訊號量陣列(或訊號量集合)的數目上限。這個限制可

以通過增加核心引數 semmni 的取值來解決,該引數定義了系統能夠擁有的訊號量集合的

總數。linux 可以動態調整大多數核心ipc 引數值的大小,也可以靜態地修改

訊息隊列為程序提供了一種非同步傳遞訊息的方法。在使用 msgget()建立了一條訊息隊

列之後,傳送程序和接收程序就可以通過這條訊息佇列交換訊息。傳送程序將訊息傳送到

指定的訊息佇列,而接收者試圖從指定的訊息佇列中獲取訊息。如果該佇列中沒有訊息的

話,則接收者根據自己是否要等待的意願而阻塞或返回某個標誌。

表 13-2 簡要描述了在當前linux 2.4/2.6 核心實現中提供的3 個訊息佇列引數。

表 13-2 與訊息佇列相關的核心引數

名    稱 描    述 默 認 值 最 大 值

msgmni 最大訊息佇列數 16 2gb

msgmax 最大訊息長度(位元組數) 8192 2gb

msgmnb 訊息佇列中的最大位元組數 16384 2gb

注意,第 4 列中給出的最大值取決於資料型別。上述 3 個核心引數都是 int 型別,因

此在32 位intel 機器上,硬性上限是2gb。

linux 還定義了其他當前未用的訊息佇列相關引數。

以下各節具體分析與訊息佇列相關的引數

13.5.1 msgmni

msgmni 定義了系統範圍內的訊息佇列上限。與訊號量一樣,訊息佇列也擁有乙個相關

的識別符號。在系統初始化階段裡,核心建立乙個指向訊息佇列識別符號結構的指標陣列。該

陣列的項數由 msgmni確定。對於每個訊息佇列,linux 核心為識別符號分配44b,為訊息隊

列資料結構分配 96b。為了獲得更多的訊息佇列資源,可以動態增加 msgmni 取值。和信

號量一樣,訊息佇列識別符號的最大數目也受限於ipcmni。msgmni的預設上限為 16b,這

可能不足以保證一些大型資料庫應用平滑地執行。如果在系統上要執行資料庫應用的話,

推薦預設上限值是 128b。

13.5.2 msgmax

msgmax 限制程序可以傳送的訊息長度。該引數由 msgsnd()函式加以應用。如果待發

送訊息的長度超過該值,則返回乙個錯誤。該引數可以在執行時調整

13.5.3 msgmnb

msgmnb 確定乙個訊息佇列的容量。該引數的取值儲存在訊息佇列識別符號結構的某個

域中,用於確定是否存在著對新訊息進行排隊的空間。msgmnb 值可以動態修改,預設為

16384。修改其取值會影響到所有新的訊息佇列的容量。使用者可以通過 msgctl()系統呼叫來

增加現有訊息佇列的容量

修改訊息佇列的引數

1.永久修改

root使用者下修改/etc/sysctl.conf 檔案。

2.臨時修改

root使用者下sysctl -w kernel.msgmnb= 1048576

Linux IPC 訊息佇列

systemv訊息佇列 為了便於程序之間通訊,我們可以使用管道通訊 systemv也提供了一些函式來實現程序的通訊.這就是訊息佇列.include int msgget key t key,int msg int msgsnd int msgid,struct msgbuf msgp,int msg...

Linux IPC 之訊息佇列

system v or posix 該使用哪個呢,這是個問題 相對而言,我更傾向於後者 posix mq posix mq 的概況看這裡 man mq overview 簡單的實現 include include include include define my mq name my test m...

linux IPC之訊息佇列

訊息佇列就是乙個訊息的鍊錶。可以把訊息看作乙個記錄,具有特定的格式以及特定的優先順序。對訊息佇列有寫許可權的程序可以向其中按照一定的規則新增新訊息 對訊息佇列有讀許可權的程序則可以從訊息佇列中讀走訊息。在linux系統中訊息佇列與鍵值一一對應。訊息佇列是通過鍊錶管理的,核心提供乙個struct ms...