You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Debian 9.3系统内存占用异常:无法定位内存消耗进程求助

为什么ps aux的RSS总和和free的已用内存对不上?

嘿,这个问题我碰到过好多次啦——Linux内存管理的“小陷阱”很容易让人困惑,我来给你掰扯清楚!

首先你要明白:free命令里的「已用内存」和ps aux统计的进程RSS总和根本不是一个维度的东西。前者包含了内核内存、文件缓存、共享内存等很多ps aux不会统计的部分,具体来说有这几个核心原因:

1. 内核本身占用的内存没被统计

ps aux只能统计用户态进程的物理内存(RSS),但Linux内核自己也要占用内存:比如内核代码、内核数据结构、进程的内核栈、slab缓存(内核用来管理小对象的内存池)等等。这些内存完全不在ps aux的统计范围内。

你可以用这些命令查看内核内存的使用情况:

# 实时查看slab缓存的占用(按内存排序)
slabtop -o
# 从meminfo里提取关键内核内存项
cat /proc/meminfo | grep -E 'Slab|SReclaimable|SUnreclaim|KernelStack|VmallocUsed'

其中SUnreclaim是不可回收的内核缓存,这部分是实打实被占用的;KernelStack是每个进程对应的内核栈内存,每个进程都要占一点,积少成多。

2. 文件缓存/缓冲区占了大头

Linux的内存管理策略是尽量把空闲内存用来做缓存——缓存磁盘文件(Page Cache)和块设备数据(Buffers),这样下次读写这些文件时速度会快很多。这部分内存在free里算在「已用」里,但其实是可以被系统自动回收的(当进程需要内存时会立刻释放)。

你可以用free -h看更清晰的分类:

free -h

重点看available项,这个才是系统真正能立刻分配给新进程的内存,而used里包含了buff/cache,把used减去buff/cache得到的数值,才会和ps aux的RSS总和更接近。

3. 共享内存、tmpfs等特殊内存区域

像tmpfs(用内存模拟的文件系统)、System V共享内存、匿名共享映射这些内存,要么属于内核管理,要么被多个进程共享,ps aux的RSS统计要么不会算进去,要么会重复计算(多个进程共享同一块内存时,每个进程的RSS都会把这块内存算一遍)。

你可以用这些命令排查:

# 查看所有tmpfs挂载点的使用情况
df -h -t tmpfs
# 查看System V共享内存
ipcs -m
# 查看meminfo里的共享内存总占用
cat /proc/meminfo | grep Shmem

更准确的进程内存统计工具

如果想得到更精准的进程内存占用,推荐用smem工具(先安装:apt install smem),它会自动处理共享内存的重复计算,给出三种更合理的统计维度:

smem -t -k
  • USS:进程独占的物理内存(完全属于这个进程,不会被其他进程共享)
  • PSS:按比例分配共享内存后的实际占用(比如一块内存被2个进程共享,每个进程算一半)
  • RSS:和ps aux一样的物理内存统计(包含共享内存的全部大小)

总结

你的情况大概率是文件缓存+内核内存+共享内存这几部分占用了ps aux没统计到的内存,这是Linux正常的内存管理策略,不是内存泄漏——只要free -h里的available数值还比较充足,就不用担心。如果真的怀疑有内存泄漏,可以用smem持续观察进程的USS变化,或者用vmstat监控内存回收情况。

内容的提问来源于stack exchange,提问作者mox

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 04:29:05