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

您的位置:首页 >如何在Linux中查看共享内存大小

如何在Linux中查看共享内存大小

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

扫一扫,手机访问

ipcs -m 的 bytes 列才是 System V 共享内存真实大小,因其直接读取内核 shmid_ds.shm_segsz 字段,反映 shmget() 指定且页对齐后的固定值,不随进程读写变化。

如何在Linux中查看共享内存大小

ipcs -m 仍然是查看 System V 共享内存大小最直接、也最稳妥的办法,里面的 bytes 列,显示的就是每一段共享内存对应的实际字节数。至于 freetop 里的 shared 字段,别混为一谈——它统计的只是进程之间共享的物理页,和 IPC 共享内存并不是一回事。

为什么 ipcs -mbytes 才是真实大小

System V 共享内存段在内核中独立存在,bytes 字段来自内核 shmid_ds.shm_segsz,是创建时 shmget() 指定的 size 值(经页对齐后),不会因进程读写而动态变化。常见误解:

  • 误把 free -h 输出里的 shared 当作共享内存总量——它只是 tmpfs 和匿名页共享的粗略估算,不含 System V 段
  • psSHR 列——那是进程私有映射中“可能被共享”的部分,无法反推某段 IPC 内存是否被占用
  • /dev/shm/ 下文件大小——这只反映 POSIX 共享内存(shm_open() 创建),和 shmget() 完全无关

快速定位大段或泄漏段:盯住 bytesnattch

执行 ipcs -m 后,重点关注这两列组合:

  • bytes 很大(比如 >50MB)且 nattch == 0 → 段已无人 attach,但未调用 shmctl(shmid, IPC_RMID, NULL),属于典型泄漏
  • bytes 中等(如 1–10MB)但 nattch 持续波动 → 可能有进程反复 shmat()/shmdt(),需结合 ipcs -m -pcpid/lpid,再用 ps -p PID -o pid,comm,args 确认进程行为
  • 想算总占用?用 ipcs -m | tail -n +2 | awk '{sum += $4} END {print sum}' ——注意是 $4bytes),不是 $5nattch

查不到你代码创建的段?先确认用的是哪套 API

如果你的程序用了 mmap() + /dev/shm/mysegipcs -m 一定为空——它只管 System V(shmget/shmctl)。此时该换命令:

  • 查 POSIX 段: ls -lh /dev/shm/(大小即文件大小)
  • 看整体占用: df -h /dev/shm(受 shmmaxshmall 限制,但和 System V 的 /proc/sys/kernel/shm* 参数无关)
  • 验证是否真用了 POSIX:代码里有没有 shm_open()open("/dev/shm/xxx")?有就是它

很多人最容易忽视的,恰恰是这一点:System V 共享内存段只要一创建出来,就会脱离进程生命周期,单独留在系统里;哪怕相关进程已经全部退出,只要没有显式删除(shmctl(..., IPC_RMID)ipcrm -m shmid),它就会一直占用内核资源,bytes 的值也不会发生变化。

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

热门关注