在排查麒麟系统共享内存问题时,常见的操作流程如下:首先使用 cat /proc/sysvipc/shm 或 ipcs -m 查看当前有哪些活跃的内存段,重点关注 size 与 lpid 字段;接着通过 ipcs -m -i [shmid] 查询该段归属的进程,再用 ps -p [PID] 确认进程是否仍在运行;确认没有有效使用者后,最后利用 ipcrm -m [shmid] 安全清理。遵循上述步骤,大多数残留的共享内存问题都能顺利解决。

查看系统当前活动的共享内存段
直接读取内核维护的 /proc/sysvipc/shm 接口即可,该文件以结构化表格形式实时列出所有尚未销毁的共享内存段。字段包括键值、ID、拥有者、权限、大小和连接数。
操作很简单,打开终端执行:
cat /proc/sysvipc/shm
输出中每一行对应一个共享内存段,请重点关注第4列(size,单位为字节)和第7列(lpid,对该段最后操作的进程PID)。如果发现 size 为 0 或 lpid 为 0,基本可以判断该段已失效,只是尚未被彻底清理。
用ipcs命令解析共享内存段详情
ipcs 是 SysV IPC 的标准工具,能将 /proc/sysvipc/shm 的原始数据转译成更易读的形式,同时支持按权限、大小、连接数等维度进行筛选,比直接 cat 更适合判断异常段。
三种常用方法:
方法一:列出全部共享内存段(含键、ID、所有者、权限、字节数、连接进程数)
ipcs -m
方法二:仅显示当前用户拥有的共享内存段,避免 root 或其他服务创建的段干扰判断
ipcs -m -u
方法三:按大小降序排列,快速定位占用过大的段
ipcs -m --sort size | tail -n +2
小提示:若提示 command not found,请先执行 sudo apt install util-linux 安装相应软件包。
定位共享内存段归属的进程
当发现某个共享内存段 size 异常庞大,或者 lpid 长时间未更新时,务必查明是由哪个进程创建并持有的,否则不可贸然清理。具体操作分三步进行:
第一步:从 ipcs -m 输出中复制目标段的 shmid(即第2列数字)。
第二步:执行 ipcs -m -i [shmid] 查看该段详细信息,其中的 pid of creator 与 pid of last operator 字段明确标出创建者与最近操作者的 PID。
第三步:使用 ps 反查进程名:
ps -p [PID] -o pid,ppid,comm,args
若 ps 没有输出,说明该进程已退出,但共享内存段因未调用 shmctl(IPC_RMID) 而残留——这种情况下可以安全删除。
删除指定共享内存段
此操作存在风险,仅在确认段已无有效使用者后方可执行,否则误删正在使用的段会导致关联进程崩溃。执行命令:
ipcrm -m [shmid]
删除成功后,再用 ipcs -m 确认该 ID 已不再显示。若返回 Invalid argument,说明该 shmid 已不存在或权限不足,需要检查是否输错了 ID,或者漏加了 sudo。
