需求

因为需要在多个进程之间通过消息队列传输数据,所以需要加大消息队列的大小。

解决

首先确定使用的是 System V 还是 POSIX 的消息队列,这两种从 API 到配置都不一样。本文主要提的是 System V 的消息队列。

System V

查看当前系统中的设置

cat /proc/sys/kernel/msgmni
cat /proc/sys/kernel/msgmax
cat /proc/sys/kernel/msgmnb
# 查看当前使用
ipcs -u

# 查看限制
ipcs -l

修改配置

System V 的消息队列配置文件是 /etc/sysctl.conf 这个总的配置文件或者 /etc/sysctl.d/ 文件夹下面的细分配置文件。

sudo vim /etc/sysctl.d/11-message-queue.conf

# set message queue

# set message number of any queue
kernel.msgmni = 312

# set one message max size
kernel.msgmax = 8192

# set all message totall max size
kernel.msgmnb = 319488

生效配置

可以参考 /etc/sysctl.d/README.sysctl 里面的重新加载的命令。

service procps restart

检查修改结果

使用 ipcs -l 来查看结果。

POSIX

查看系统限制

# 只看 message queue
ulimit -q

# 所有的限制
ulimit -a

查看详细设置

通过 man mq_overview 来查看消息队列的介绍。

# 消息大小
cat /proc/sys/fs/mqueue/msgsize_max
# 消息数目
cat /proc/sys/fs/mqueue/queues_max

修改

直接修改相应的文件即可。

参考

Linux 消息队列长度处理

linux消息队列的内核限制

What are the commands to change value to msgmnb?

Linux ulimit命令