麒麟系统内存虚高时需定位shared内存占用进程:先用cat /proc/meminfo | grep ^shmem确认shmem是否超物理内存15%,再通过du -sh /dev/shm/*和lsof +d定位大文件及归属进程,最后用ipcs -m结合ipcrm清理残留共享段。

当麒麟系统出现内存使用率虚高、可用内存远低于物理总量,或top中进程RSS总和不大却提示“内存不足”时,必须定位真正吃掉shared内存的进程——因为这部分内存被多个进程共享,不会在单个进程的RES中重复计算,却真实占用物理RAM。
先确认shared内存是否异常膨胀
打开终端,执行:cat /proc/meminfo | grep ^Shmem。输出如Shmem: 2894560 kB,换算后若超过物理内存的15%,说明shared已实质性超标。
【Shmem值是全局共享内存总量的唯一权威依据】。该数值与df -h | grep tmpfs中所有tmpfs挂载点Used之和应基本一致;若偏差超200MB,说明存在未挂载的匿名共享段,需后续用ipcs排查。
定位/dev/shm中占用最大的文件或目录
执行:cd /dev/shm && sudo du -sh * 2>/dev/null | sort -hr | head -n 5。这一步列出当前最大的5个条目,常见罪魁有postgres_12345、chrome-shared-6789或无意义长名缓存目录。
若发现myapp_cache占1.8G,则继续下钻:sudo du -sh myapp_cache/* 2>/dev/null | sort -hr | head -n 3,快速锁定具体大文件。
注意:/dev/shm默认无上限,程序写入大文件会直接吃光内存,且不触发OOM Killer。
反向追踪归属进程
第一步:对上一步发现的大文件,检查其属主进程ID。
执行:lsof +D /dev/shm/myapp_cache 2>/dev/null | awk ' ~ /^[0-9]+[uw]/ {print }' | sort -u,提取所有打开该路径的PID。
第二步:用ps查清进程详情。
对每个PID执行:ps -p PID -o pid,comm,args,重点关注comm列(命令名)和args列(完整启动参数)。
第三步:若PID对应进程仍在运行,且非系统关键服务(如dbus、systemd-journald),可结合其args判断是否为应用缓存、数据库临时段或浏览器IPC残留——这类进程往往长期持有句柄却不释放内存。
若lsof +D无输出,但du显示目录体积巨大,说明文件已被删除但句柄未关闭(即“deleted”状态),此时必须重启对应进程才能释放shared内存。
检查System V共享内存段并关联进程
方法一:直接查大段归属
执行:ipcs -m | awk '$5 > 100000 {print $2,$5,$6}' | while read shmid size cpid; do echo "shmid:$shmid size:${size}KB cpid:$cpid"; ps -p $cpid -o pid,comm,args 2>/dev/null; done 2>/dev/null。
该命令自动筛选SEGSZ > 100MB的段,并打印其创建进程的完整信息。
方法二:人工分步验证
① 运行ipcs -m列出所有段,记录SEGSZ列超100MB的shmid;
② 对每个shmid,执行ipcs -m -i shmid查看详细信息,重点看CPID(创建进程PID)和LPID(最后操作PID);
③ 执行ps -p CPID -o pid,comm,args确认进程是否存在、是否为僵尸或残留。
【若CPID已不存在,该共享段永不自动回收,必须立即执行ipcrm -m shmid释放】。











