看 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 主机上会被计入已用内存。