ipcs 命令可非 root 查 IPC 资源:-m 看共享内存的 bytes(真实内存)、nattch(当前 attach 进程数)和 dest 状态;-s 查信号量集的 nsems(每集信号量数),注意其不自动销毁;-l 显示内核硬限制,如 shmmni、shmmax 等,超限则 shmget/semget 失败。

直接用 ipcs 就能查,不需要 root 权限(除非要看别人创建的),但得知道查什么、怎么看字段、哪些值真有用。
查共享内存段:重点看 bytes 和 nattch
运行 ipcs -m,输出里关键列是:
-
key和shmid:定位用,前者是程序传给shmget()的键,后者是内核分配的 ID -
bytes:该段实际占用字节数,不是虚拟大小,是真实内存开销 -
nattch:当前有多少进程正 attach 着它 —— 注意不是“创建者”,是正在用的进程数 -
status列出现dest表示该段已被标记删除,但仍有进程 attach,此时内存不会释放,直到所有进程 detach
非 root 用户默认只看到自己创建的段;要查全系统,加 -a 或用 sudo ipcs -ma。别信 ipcs -m | wc -l 算段数,表头占一行,tail -n +2 才准。
查信号量集:小心 nsems == 1 的堆积
运行 ipcs -s,重点关注:
-
nsems:每个信号量集里含几个信号量,不是“系统总信号量数” -
key/semid:同共享内存,用于定位和清理 - 大量
nsems == 1的条目通常是 PostgreSQL、旧版 Java 或某些 C++ 库的习惯写法,不是 bug,但容易耗尽max number of semaphore sets(ipcs -l查)
System V 信号量不会随进程退出自动销毁,哪怕创建它的进程已死,也得手动 ipcrm -s semid 或程序里调 semctl(..., IPC_RMID)。POSIX 信号量(路径形如 /dev/shm/sem.xxx)不归 ipcs 管,得用 ls /dev/shm | grep sem 配合 lsof 查。
查系统 IPC 上限:ipcs -l 的数值是硬限制,不是建议值
执行 ipcs -l 输出的是内核参数,一旦触及就会导致 shmget 或 semget 直接失败,返回 ENOSPC:
-
max number of shared memory segments:整个系统最多允许多少个独立的shmid,跟字节大小无关 -
max size of shared memory segment:单个段最大字节数,默认常为 32MB,64 位系统可能达 4GB -
max number of semaphores per semaphore set:单个信号量集最多含几个信号量(注意不是“系统总共”)
这些值可通过 /proc/sys/kernel/shmmni、/proc/sys/kernel/shmmax 等临时修改,但重启失效;永久生效必须写进 /etc/sysctl.conf。真正容易被忽略的是:System V IPC 对象生命周期与进程无关,只取决于内核状态和显式删除动作 —— 这意味着泄漏会一直挂着,直到你发现并清理。











