ipcs -q 用于查看系统所有活跃消息队列,输出 key、msqid、owner、perms、used-bytes 和 messages;空输出表示无队列,权限限制属正常隔离机制。

用 ipcs -q 查看当前所有消息队列
直接运行 ipcs -q 就能列出系统中所有活跃的消息队列,这是最常用、最快速的入口。输出包含 key(键值)、msqid(队列 ID)、owner(所有者)、perms(权限)、used-bytes(已用字节数)和 messages(当前消息条数)。
常见错误现象:执行后返回空或提示 “No message queues” —— 说明当前没有创建过消息队列,不是命令错了,而是确实没资源;若提示权限不足(如非 root 用户看不到其他用户队列),属正常行为,System V IPC 默认按用户隔离。
-
ipcs -q不带其他参数时只显示基本信息,适合快速巡检 - 如果队列数量多,可加
| less或| grep过滤,例如ipcs -q | grep myapp - 注意
msqid是内核分配的整数 ID,不是你传给msgget()的key;同一key可能对应不同msqid(比如旧队列被删后重建)
用 ipcs -q -t -p -c 查看详细操作信息
仅看 ID 和大小不够定位问题,调试时需要知道谁创建、谁最后读写、时间戳等。组合使用 -t(时间)、-p(PID)、-c(UID/GID)能补全上下文。
典型使用场景:某个队列积压大量消息但无人消费,通过 ipcs -q -t -p 可发现 lpid(最后操作 PID)长时间没更新,再用 ps -p <lpid></lpid> 看进程是否僵死或退出了。
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
-
lpid是最后调用msgsnd()或msgrcv()的进程 PID,不是创建者;cpid才是创建该队列的进程 PID -
msg_stime和msg_rtime是秒级时间戳(Unix time),不是可读日期,需用date -d @171xxxxxxx转换 - 普通用户执行时,
cuid/uid可能显示为数字而非用户名,这不是 bug,是内核原始字段值
用 ipcs -l 查看系统级限制
当 msgget() 返回 -1 且 errno == ENOSPC,或 msgsnd() 失败报 EAGAIN,大概率是触达了内核对消息队列的硬限制,此时必须查 ipcs -l。
重点关注三行:max queues system wide(全局最多 1736 个队列)、max size of message(单条消息上限 65536 字节)、default max size of queue(单队列默认 65536 字节)。这些值在 /proc/sys/kernel/ 下可调,但生产环境改前务必评估影响。
- 修改限制需 root 权限,例如:
echo 2048 > /proc/sys/kernel/msgmni(调整最大队列数) -
ipcs -l输出中的 “Messages: Limits” 段落才是消息队列专属限制,别跟共享内存或信号量的混在一起看 - 应用频繁创建/销毁队列时,要注意
msgmni(队列总数上限)比单队列大小更容易成为瓶颈
用 ipcs -q -i <msqid></msqid> 查单个队列详情
当你已经从 ipcs -q 中拿到某个 msqid(比如 12345),想确认它的当前容量、消息数、权限或创建者,就用 -i 选项查具体实例。
这个命令会输出完整的 struct msqid_ds 内容,包括 msg_qnum(当前消息数)、msg_qbytes(队列最大字节数)、msg_perm.mode(八进制权限,如 0666)等。它比 ipcs -q 多出结构体字段级别的精度,适合排查 msgctl(..., IPC_SET, ...) 是否生效。
-
msqid必须是十进制整数,不能是十六进制或 key 值;输错会报 “Invalid argument” - 输出里的
__msg_cbytes是实际已用字节数,和used-bytes列一致,但这里还附带了msg_qbytes供对比 - 如果队列已被
msgctl(msqid, IPC_RMID, NULL)删除,ipcs -q -i <msqid></msqid>仍可能短暂显示(内核延迟回收),此时msg_qnum通常为 0 且时间戳冻结
msgctl(..., IPC_RMID, ...) 或系统重启,队列就一直留在内核里占资源。查到异常残留队列时,别只 kill 进程,得用 ipcrm -Q <msqid></msqid> 或代码里删干净。










