商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 系统应用 > Linux怎么查看共享内存大小

Linux怎么查看共享内存大小

  发布于2026-08-07 阅读(0)

扫一扫,手机访问

很多人误以为 free 命令里的 shared 字段代表的是 IPC 共享内存,其实这是个常见的误区。这个字段实际上反映的是 tmpfs 挂载点(比如 /dev/shm)的内存占用情况,它并不包含由 ipcs -m 管理的 System V 共享内存段。那么,如何精准查询不同类型的共享内存呢?查 System V 共享内存,请用 ipcs -m;查 POSIX 共享内存,看 ls -l /dev/shm/;而若想了解内核层面的实际消耗,则需关注 /proc/meminfo 中的 Shmem 字段。

Linux怎么查看共享内存大小

free 命令里 shared 字段不等于 IPC 共享内存

不少人一看到 free 输出中的 shared 列,就会下意识把它理解成 System V 或 POSIX 共享内存的大小,但这其实是个常见误解。这个字段在较新的内核(5.0+)里已经被弃用,很多发行版(例如 Ubuntu 22.04、CentOS 8+)默认要么显示为 0,要么干脆不再展示;而且就算它有数值,表示的也不是 ipcs -m 管理的共享内存段,而是 tmpfs 挂载点(比如 /dev/shm)实际占用的内存。

查 System V 共享内存用 ipcs -m

这是最直接的方式,专门用于列出当前所有 System V 共享内存段:

  • ipcs -m 显示所有共享内存段 ID、所有者、权限、大小(bytes)、连接数(nattch)等
  • ipcs -mu 只显示汇总统计:总段数、总字节数、最大段大小
  • 若只关心某个进程创建的段,可结合 ipcs -m | grep 过滤

注意:ipcs 不显示 POSIX 共享内存(shm_open() 创建的),这类内存挂载在 /dev/shm 下,属于 tmpfs 文件系统。

查 POSIX 共享内存看 /dev/shm 目录

POSIX 共享内存本质上是通过 shm_open()/dev/shm 下创建的文件,所以它的“大小”就是这些文件的磁盘占用(实际是内存映射):

  • 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。两者底层机制不同,监控时得分开对待。

本文转载于:https://www.php.cn/faq/2942878.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注