free命令中shared字段不等于ipc共享内存,它实际反映tmpfs挂载点(如/dev/shm)占用内存,而非ipcs -m管理的system v共享内存段;查system v用ipcs -m,查posix用ls -l /dev/shm/,查内核实际消耗看/proc/meminfo中shmem字段。

free 命令里 shared 字段不等于 IPC 共享内存
很多人看到 free 输出里的 shared 列,就以为那是 System V 或 POSIX 共享内存的大小,其实不是。这个字段在较新内核(5.0+)中已被弃用,多数发行版(如 Ubuntu 22.04、CentOS 8+)默认显示为 0 或直接不显示;即使有值,它实际反映的是 tmpfs 挂载点(比如 /dev/shm)占用的内存,而非 ipcs -m 管理的共享内存段。
查 System V 共享内存用 ipcs -m
这是最直接的方式,专门用于列出当前所有 System V 共享内存段:
-
ipcs -m显示所有共享内存段 ID、所有者、权限、大小(bytes)、连接数(nattch)等 -
ipcs -mu只显示汇总统计:总段数、总字节数、最大段大小 - 若只关心某个进程创建的段,可结合
ipcs -m | grep <username></username>过滤
注意:ipcs 不显示 POSIX 共享内存(shm_open() 创建的),这类内存挂载在 /dev/shm 下,属于 tmpfs 文件系统。
查 POSIX 共享内存看 /dev/shm 目录
POSIX 共享内存本质上是通过 shm_open() 在 /dev/shm 下创建的文件,所以它的“大小”就是这些文件的磁盘占用(实际是内存映射):
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
-
ls -l /dev/shm/查看所有 shm 文件及其大小(单位字节) -
du -sh /dev/shm/* 2>/dev/null | sort -h按大小排序显示(忽略无权限项) -
df -h /dev/shm查看整个 tmpfs 分区的已用/可用空间(默认上限通常是 64MB,可通过 mount 参数调整)
⚠️ 容易踩坑:如果程序调用 shm_unlink() 后未 munmap,文件虽被删除但内存仍被占用,ls 看不到,df 却已计入已用空间 —— 此时需结合 lsof +D /dev/shm 找出残留句柄。
查内核实际分配的共享内存总量(含 Slab 缓存)
如果你真正关心的是“系统为此类机制实际消耗了多少物理内存”,不能只看用户态可见部分。内核把共享内存段元数据、页表、Slab 分配器开销等都算进去,最准的来源是:
-
cat /proc/meminfo | grep -i "shmem\|shm",重点关注Shmem:字段(即 tmpfs + shm 使用的总内存) -
cat /proc/meminfo | grep -i "slab"中的SReclaimable可能包含部分共享内存相关缓存,但无法精确剥离 - 注意:
Shmem:包含所有 tmpfs 实例(如/dev/shm、/run等),不单指 IPC 共享内存
复杂点在于:System V 共享内存段本身不直接出现在 /proc/meminfo 的 Shmem 统计里,它走的是匿名页路径,而 POSIX 共享内存(/dev/shm)才计入 Shmem。两者底层机制不同,监控时得分开对待。










