为什么 free 显示内存用完,但系统依然正常?
在 Linux 运维过程中,很多人第一次使用 free 命令时,都会被输出结果吓到。系统明明运行正常,服务也没有异常,但 free 显示 used 非常高、free 几乎为 0,看起来就像内存已经耗尽了一样。
事实上,这是 Linux 内存管理的正常行为。
一、先看一个常见的 free 输出
total used free sharedbuff/cache available
Mem: 7986 7420 120 180 446 5200
Swap: 2048 0 2048
很多人第一反应是:
free 只剩 120MB,内存是不是要爆了?
但实际上,这种判断方式是错误的。
二、Linux 的设计理念:内存不用就是浪费
Linux 有一个非常重要的内存管理原则:
空闲的内存,是被浪费的内存。
因此,Linux 会尽可能利用空闲内存来做缓存,以提升系统整体性能,而不是让内存一直保持空闲状态。
这些缓存主要包括:
[*]Page Cache(文件缓存)
[*]Buffer Cache(块设备缓存)
[*]dentry / inode 缓存
它们都会被统计进 used,而不是 free。
三、为什么 free 看起来几乎为 0?
系统运行一段时间后,内存通常会被这样使用:
[*]一部分被进程真实占用
[*]大量内存被用于文件与磁盘缓存
[*]Linux 主动压缩真正的 free 内存
于是你看到的现象是:
[*]free 非常小
[*]used 非常大
[*]系统运行却完全正常
这是一种健康状态,不是异常。
四、判断内存是否紧张,要看 available
从较新的 Linux 版本开始,free 中增加了一个非常关键的字段:
available它表示:
[*]在不触发 OOM、不明显影响性能的前提下,系统还能提供给程序使用的内存。
简单理解就是:
[*]free:当前完全空闲的内存(参考意义不大)
[*]available:真正还能再用的内存(最重要)
只要 available 数值充足,就说明内存并不紧张。
五、缓存会不会“霸占”内存?
不会。
当系统需要为新进程分配内存时:
[*]Linux 会优先回收 Page Cache
[*]不需要人工干预
[*]不会影响正在运行的程序
缓存是可回收资源,不是死占内存。
六、什么时候才算真正的内存不足?
只有出现以下情况,才说明内存真的有风险:
[*]available 长时间处于很低水平
[*]系统开始频繁使用 swap
[*]应用响应明显变慢、卡顿
[*]内核日志中出现 OOM Killer
常用排查命令包括:
[*]free -h
[*]vmstat 1
[*]dmesg | grep -i oom
七、为什么不建议随便清理缓存?
你可能见过这样的命令:
echo 3 > /proc/sys/vm/drop_caches在生产环境中:
[*]不建议频繁使用
[*]可能导致磁盘 IO 突增
[*]会降低整体性能
缓存是性能优化的一部分,而不是问题来源。
八、总结
[*]free 显示内存用完,并不代表内存真的耗尽
[*]Linux 会主动使用内存作为缓存
[*]判断内存是否紧张,应重点关注 available
[*]没有 OOM、系统不卡顿,就属于正常状态
页:
[1]