首页/系统/Linux 内核与性能调优速查/kernel.msgmax 消息队列单条上限
sysctl 内核参数72 条

kernel.msgmax 消息队列单条上限

SysV 消息队列单条消息大小上限(常见 8192 字节);同类参数 msgmnb 限制单队列总字节、msgmni 限制队列数量。

参数是什么

kernel.msgmax 是 Linux 内核 SysV 消息队列(CONFIG_SYSVIPC)允许的单条消息字节上限,常见默认值 8192。应用调用 msgsnd() 投递时,内核先校验消息长度(含前导的类型字段)是否超过该值,超限直接返回 EINVAL,不会进入排队等待。它与另外两个参数共同构成限额:msgmax 管单条消息,msgmnb 管单个队列的累计字节(常见默认 16384),msgmni 管系统内队列总数(默认值随内核版本与内存变化)。

基本信息

适用平台Linux(CentOS/RHEL、Ubuntu/Debian、SUSE)
相关接口msgget / msgsnd / msgrcv / ipcs
单位字节
常见默认值msgmax 8192、msgmnb 16384
权限要求查看无需特权,修改需 root 或 CAP_SYS_ADMIN
持久化写入 /etc/sysctl.d/*.conf 后执行 sysctl --system

典型使用场景

  • 安装传统企业应用(银行核心、ERP、老版中间件)时,厂商基线文档要求同时调大 msgmax/msgmnb/msgmni
  • 应用日志出现 msgsnd: Invalid argument 或返回 EINVAL,需确认消息体是否超过单条上限
  • 批处理一次投递整条结构化报文(单条几十 KB),需要提高 msgmax 并同步放宽 msgmnb
  • 排查消息队列积压:结合 ipcs -q 的 used-bytes 与 Messages 列判断是消费慢还是单条放不下
  • 容器与宿主共享 IPC 命名空间时,限额由宿主内核参数决定,容器内看到的也是宿主值

查看与调整

查看与调整
ipcs -l  # 打印消息队列、共享内存、信号量三类的当前限额
ipcs -q  # 只列现有消息队列,关注 used-bytes 与 Messages 两列
sysctl kernel.msgmax kernel.msgmnb kernel.msgmni  # 查看当前内核参数值
sysctl -w kernel.msgmax=65536  # 临时调整,重启后回退
printf 'kernel.msgmax = 65536\nkernel.msgmnb = 1048576\n' > /etc/sysctl.d/90-ipc.conf  # 持久化
sysctl --system  # 重新加载全部配置并回显,确认写入生效

报错对照

错误码含义排查动作
EINVAL单条消息超过 msgmax,或消息结构非法核对消息长度是否超过 msgmax,必要时同步抬高 msgmnb
EAGAIN队列已满(msgmnb 到顶)且使用了非阻塞发送看 ipcs -q 的 used-bytes 与消费者速度,别只调单条上限
ENOMEM内核内存不足,无法再为队列分配空间查系统整体内存与 slab 占用,而不是继续抬参数
单条消息长度还受 msgmnb 约束:如果 msgmax 大于等于 msgmnb,单条消息永远无法完整入队。抬 msgmax 时应同时抬 msgmnb,并按「并发消息条数 × 单条大小」估算队列容量。
现代应用大多改用 POSIX 消息队列(mq_send)或 Kafka/RabbitMQ 一类中间件,它们不受这三个参数约束。排障前先确认应用用的是 SysV IPC 还是 POSIX 接口,避免调了参数却毫无效果。

易错点

  • 只调 kernel.msgmax 不改 msgmnb:单条上限提高后仍被队列总字节卡住,表现为排队或 EAGAIN,参数看起来「没生效」
  • sysctl -w 只在本次启动有效,重启后回退;正式环境必须落到 /etc/sysctl.d/ 并用 sysctl --system 复核回显
  • 队列数据存放在内核内存且不受应用自身内存限额约束,盲目把 msgmnb 调到几百 MB 会放大内核内存占用并加剧内存压力
  • 容器内直接写 /proc/sys/kernel/msgmax 通常被拒绝(只读挂载或权限不足),且 SysV IPC 命名空间隔离时改的是宿主参数,需在宿主侧统一调整
  • 参数名容易混:消息队列是 msgmax/msgmnb,共享内存是 shmmax/shmall,信号量是 sem;改错一族会白折腾一轮

数据来源与参考

  • Linux 内核 Documentation/admin-guide/sysctl/kernel.rst
  • man 2 msgop
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌