CH-J Server Manager通过 SSH 管理服务器
菜单
全部指南与文章 →

如何读懂 Linux 服务器的 RAM、缓存和 swap

了解 free 各列的含义、为何内存使用率高往往没有问题,以及哪些迹象才真正表明内存不足。

看 available,而不是 free

Linux 会把原本闲置的内存用作磁盘缓存,因此健康的服务器空闲内存很少是正常现象。available 列是内核对新任务在不使用 swap 的情况下能获得多少内存的估计。应关注的就是这个数值。used 的具体计算方法取决于工具版本,因此不要在不同系统之间比较它。

free -h
grep -E 'MemAvailable|Shmem:|SReclaimable' /proc/meminfo

缓存中的哪些内容能释放,哪些不能

应用需要内存时,页缓存通常可以释放。共享内存和 tmpfs(Shmem)也计入 cache,但不能直接丢弃,因为其中的数据在磁盘上没有副本。因此,缓存很大而可用内存很少,往往意味着 tmpfs 或共享内存段很大。

df -h -t tmpfs
sudo slabtop -o | head -15

使用了 swap 不一定就是问题

服务器把很少使用的页放在 swap 中数周也可能没有影响。真正有害的是持续换入换出。观察 vmstat 中的 si 和 so 列:数值持续大于零,说明系统正在频繁进行 swap 换页,这是实际内存不足的迹象。

swapon --show
vmstat 1 5

找出内存被谁占用

按驻留内存对进程排序。RSS 会把进程间共享的页计入每一个进程,因此不能简单地将多个进程的数值相加。如果已安装支持 PSS 的工具,例如 smem,可以得到更合理的总量。

ps -eo pid,user,rss,comm --sort=-rss | head -15

识别真正的内存不足

迹象包括可用内存少、持续进行 swap 换页,以及进程被内存不足终止机制(out-of-memory killer)杀死。检查内核日志。不要为了让数值好看而运行 drop_caches:这只会让服务器重新从磁盘读取数据,解决不了问题。

sudo journalctl -k --no-pager | grep -iE 'out of memory|oom-kill'

CH-J Server Manager 中的内存

System Monitor 通过 SSH 读取这些数值。在 Linux 上,它将 used 定义为 MemTotal − MemFree − Buffers − Cached − SReclaimable,available 则采用内核估计值。共享内存属于 Cached,无法释放;条形图中的类别互不重叠。由于公式与某些版本的 free 不同,数值可能不完全一致。它还显示 swap 及其使用历史。ZFS ARC 不单独处理,因此在 ZFS 主机上会被计入已用内存。

详细文档

man: free →

man: proc_meminfo →

生物识别解锁与安全 →