1. 程式人生 > >linux訊息佇列的核心限制

linux訊息佇列的核心限制

訊息佇列:

1.每次msgrcv一個訊息,1.那個訊息會在核心中移除 2.每次msgrcv都只會給一個訊息出來,不管你rcv用多大的buf來接收,都是可以的。如果msgrcv的bufSize小於實際的該訊息的大小,那麼可以設定一個標誌:表示截斷。 如果不設定,那麼會報錯。取不出來。

2.訊息滿了,則預設0為阻塞,直到有了空間位置,才能snd訊息進入到核心。

  訊息空了,則預設為0阻塞,直到有了一個訊息位置,才能 rcv訊息進入到程序記憶體。

3.如果指定msgflg:MSG_NOERROR,如果函式取得的訊息長度大於msgsz,將只返回msgsz 長度的資訊,剩下的部分被丟棄了。如果不指定這個引數,E2BIG 將被返回,而訊息則留在佇列中不被取出。當訊息從佇列內取出後,相應的訊息就從佇列中刪除了。

幾乎所有的 Linux 發行版本都包含 ipcs 命令,該命令可以提供當前載入到系統上的
IPC 資源資訊。通過 ipcs 可以確定系統的當前 IPC 限制,還可以檢查系統當前使用的上述
三類IPC資源的狀態。例如,假若應用程式啟動失敗,可以檢查系統上的 IPC使用情況來
判斷是否已超出了某個IPC限制。為了確定系統的IPC資源狀態,可以在 root使用者許可權下
執行帶有-u 選項的 ipcs 命令。 
# ipcs -u 

------ Shared Memory Status -------- 
segments allocated 32 
pages allocated 2361 
pages resident 253 
pages swapped   982 
Swap performance: 0 attempts     0 successes 

------ Semaphore Status -------- 
used arrays = 128 
allocated semaphores = 256 

------ Messages: Status --------

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            【系統最多的訊息佇列數量(最多支援同時16個訊息佇列)】
max size of message (bytes) = 8192  【單個訊息的最大位元組數】
default max size of queue (bytes) = 16384  【預設的單個佇列的大小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 檔案。

引數msgmax,msgmni,msgmnb都已經成功修改  更改的方法:  在配置檔案/etc/sysctl.conf中加上  kernel.msgmax=value  kernel.msgmni=value  kernel.msgmnb=value  然後執行sysctl -p  即可進行修改  

max queues system wide = // msgmni
max size of message (bytes) = //msgmax
default max size of queue (bytes) = //msgmnb

2.臨時修改
root使用者下sysctl -w kernel.msgmnb= 1048576

訊息佇列在linuxC/c++裡面沒有找到有非同步的資訊,但是java..net有,而且windows的訊息佇列就是非同步實現的。