ipcs -m 列出共享内存段基本信息,含key、id等字段,bytes为实际字节数;-i shmid查看单段详情,关注cpid/lpid判断孤儿段;-l显示系统限制,shmall需换算为字节且须防OOM。

ipcs -m 查看共享内存段基本信息
直接运行 ipcs -m 就能列出当前系统所有共享内存段,包括 key、id、owner、perms、bytes(即大小)、nattch(附加进程数)等字段。注意 bytes 列才是实际分配的字节数,不是“上限”或“虚拟大小”。如果某段显示 0 字节,大概率是已被标记删除(shmctl(..., IPC_RMID)),但仍有进程 attached,需结合 nattch 判断是否可安全清理。
ipcs -m -i shmid 查看单个段详细信息
当发现可疑大内存段时,用 ipcs -m -i (其中 shmidshmid 是 ipcs -m 输出中的第二列 ID)可看到创建时间、最后操作时间、锁状态等。特别注意 lpid(最后执行 shmat/shmdt 的 PID)和 cpid(创建该段的 PID)——若 cpid 对应进程已退出,而 nattch > 0,说明存在孤儿共享内存,可能因进程崩溃未调用 shmdt 导致。
ipcs -l 查看系统级共享内存限制
ipcs -l 显示内核参数限制,关键三项:max number of segments(kernel.shmmni)、max seg size (kbytes)(kernel.shmmax)、max total shared memory (kbytes)(kernel.shmall)。注意单位:前两者是字节或 KB,shmall 是页数(默认页大小 4KB),所以实际总上限 = shmall × 4096。若应用报 EINVAL 创建失败,优先检查这三项是否被低估,而非直接调大 shmmax。
配合 /proc/sys/kernel/ 直接读取和临时修改
所有 ipcs -l 显示的值都映射到 /proc/sys/kernel/ 下的文件,例如:cat /proc/sys/kernel/shmmax、echo 2147483648 > /proc/sys/kernel/shmmax(需 root)。永久生效要写入 /etc/sysctl.conf,但要注意:修改 shmall 后必须确保物理内存足够支撑该页数,否则可能导致 fork() 失败或 OOM killer 激活。另外,ipcs 不会实时反映新创建段的内存占用变化——它只读取内核 shm 结构体快照,真正内存释放发生在最后一个 shmdt 返回后,且无进程 attach 时。










