經常在建立訊息佇列呢,報錯No space left on device。
這時,可以通過修改MSGMNI這個參數來解決。
MSGMNI--- 這個參數決定了系統中同時啟動並執行最大的message queue的個數。
MSGMNI:/proc/sys/kernel/msgmni檔案中定義了該值;
作用:該值定義了訊息佇列的最大長度;要使db2(7.1版)正常運行,其最小值為128;
對於高負荷的DB2伺服器,可將該值調整為 >= 1024;
調諧:對於2.4.6版本的核心,其預設值為16;可用以下兩種方法改變該值
(1)如果只是臨時變動,在命令列輸入
bash# sysctl -w kernel.msgmni=128
(2) 如果要在系統啟動時改變該值,可在/etc/sysctl.conf檔案中加入以下幾句:
# Sets maximum number of message queues to 128
# Set this to 1024 or higher on production systems
kernel.msgmni = 128
(用ipcs -l 命令來查看當前ipc 參數的各種設定)
P.S.
另外幾個參數,
kernel.msgmni
kernel.msgmax
kernel.msgmnb
-----------------------------------------------------------------------------------
linux關於訊息佇列中訊息的大小的限制
在訊息佇列中,例如函數msgsnd(int msqid, const void* msgp, size_t msgsz, int msgflg);這個函數調用的時候,msgsz最大隻能為8192,也就是2的16次方。可以看出這裡的msgsz大小限制在一個short型。超過這個大小就會出錯——invalid argument。並不是其他人所說的只要msgsz是mtext的大小就不會出錯,如果sizeof(mtype)+sizeof(mtext)<=8192時,msgsz為sizeof(mtype)+sizeof(mtext)大小也沒有關係。
當然msgsz這個大小也不是不可以改變,如果要變,就去核心代碼裡面關於實現訊息佇列的程式中把這個限制改變一下就好。(我沒試過,應該可以),一般是在核心源碼中的ipc檔案夾中會有mqueue.c這個c語言程式檔案,裡面會定義DFLT_MSGSIZEMAX為8192,這應該就是為什麼msgsz最大為8192的原因,如果要改,可以改掉,然後重新編譯核心。