free 显示内存快用满了?理解 available、cache 与回收
服务器运行一段时间后,free 显示剩余内存很少,很多人会担心马上崩溃。Ubuntu 24.04 的 Linux 内核会把部分内存用于文件缓存,提高后续访问效率。判断容量是否紧张,应结合可回收空间、进程需求和业务表现,不能只盯着一个“空闲”数字。
先看工具版本与单位
在服务器执行:
free --version
free -h
free -w -m
-h 便于快速阅读,-w 把 buffers 与 cache 分列,-m 使用对应的二进制单位。不同工具版本可能调整列的计算方式,网上旧截图里的 used 公式不一定适用于当前版本。
Ubuntu 24.04 所提供的 free 手册把 used 解释为 total 减 available。要用本机版本及手册核对,不把其他系统监控面板的“已用”直接当成同一口径。free 手册列出了各字段定义与单位选项。
available 比单看 free 更接近容量问题
free 表示当前没有使用的空间,available 则估计在不交换的前提下还能为新应用提供多少内存。这个估算会考虑部分缓存和可回收内核对象,因此它可能明显大于 free。
available 也不是一个绝对可分配保证。实际分配还受控制组上限、内存碎片、特定类型内存和并发需求影响。某个容器可能先达到自身限制,而宿主机的 available 看起来仍然充裕。看全机总量时,应同时确认服务自己的资源范围。
可以把它理解为更有用的余量观察值,但不能从某个瞬间的数字推导出“再开多少个进程一定安全”。
缓存、共享内存和进程占用有重叠
buff/cache 包含文件缓存和部分可回收内核缓存,并不表示这些内容可以随时全部无代价地释放。正在使用或需要写回的页面,回收条件和成本都不同。shared 常与 tmpfs 等共享内存有关,也不能简单加到其他列上计算总占用。
类似地,把所有进程 RSS 直接相加,可能重复统计共享页面;虚拟地址空间大小也不是实际物理内存用量。内核 /proc 文档解释了 meminfo 及进程内存统计的来源和口径。
因此,先决定要回答的是“整机还有多少余量”“哪类内存在增长”还是“哪个进程负责”,再选择合适指标。不要把不同口径的数字强行拼成一张必须相等的账单。
连续观察才能发现真实压力
用 free -m -s 2 -c 10 观察一段时间,再对照请求延迟、换入换出、进程增长和内存终止记录。备份结束后缓存较大,业务仍正常且余量足够,通常与持续泄漏造成的可用内存下降不同。
如果 available 持续减少,应检查应用并发、缓存上限、长时间运行任务和共享内存文件。记录峰值出现在哪个动作之后,而不只是汇报“内存用了很多”。容器环境还要对照容器指标与宿主机指标,避免因为看的是不同范围而误判。
交换空间已用也需要结合活动程度看待。曾经换出的冷页面可能暂时留在 swap 中,不能只凭非零用量认定服务器此刻一直在抖动换页。
不用定期清缓存替代容量治理
把定期清空内核缓存当成日常优化,可能让后续请求重新读盘,反而造成更多延迟。清缓存更适合有明确目的的测试场景,不应为了让监控图下降而在生产服务器反复执行。本文不提供这样的自动清理任务。
真正需要调整时,应给应用设置合理的缓存和并发,错开内存峰值任务,或在负载验证后扩容。保留原值,改动后检查业务耗时与内存趋势,而不是仅确认 used 变小。
如果已经发生 OOM,恢复后再看 free 往往会发现余量增加,因为被终止的进程释放了内存。那是故障的后果,不能据此否定当时的压力;应结合事件时段日志完成分析。