VPS内存明明够用为什么free -h显示快满了
买了台2G内存的VPS,跑的东西没几个,敲一下free -h却发现free那一列只剩几十兆,第一反应往往是"内存被谁吃光了",赶紧到处排查是不是哪个进程内存泄漏了。其实大概率什么问题都没有,纯粹是没看懂这条命令的输出。
free那一列不是真正的"可用内存"
1 | total used free shared buff/cache available |
free这一列指的是完全没被任何东西碰过的空闲内存,Linux的设计思路是"闲着的内存就是浪费",所以只要有磁盘读写发生过,系统就会顺手把这些数据缓存进内存里(也就是buff/cache那一列),下次再读同样的文件直接从内存拿,比重新读磁盘快得多。这部分缓存看着占了不少内存,但它是可以被随时回收挪用的,不是被哪个程序死死攥在手里不放。
真正该看的是最后的available这一列,这个数字才是"如果现在有新程序要申请内存,系统实际能腾出来给它用的量",已经把可回收的buff/cache算进去了。上面这个例子里,free只有80M看着吓人,available却有1.4G,说明这台VPS内存其实很宽裕,那1.5G的缓存只是顺手存的,真要用随时能让出来。
buffer和cache具体是两个东西
buff/cache其实是两项加在一起显示的:Buffers对应的是磁盘块级别的缓存,一般占用不大;Cache对应的是文件系统层面的页缓存,读过的文件内容会留在这里,这部分通常才是大头。系统跑得越久、读写过的文件越多,这个数字自然越大,是正常现象,不是内存泄漏的迹象。
什么时候才是真的该担心
不要盯着free这一列瞎紧张,真正该留意的是available这一列持续走低、或者swap那一行用量一直在涨,这才是内存真的吃紧的信号。如果监控软件或者应用报了OOM(内存溢出被杀)的日志,那也是实打实的问题,不是缓存显示误导的假象。
手动清缓存能解决问题吗
网上能搜到用echo 3 > /proc/sys/vm/drop_caches强制清空缓存的方法,看着free那一列数字瞬间变大,容易让人误以为"解决了内存问题",实际上只是把原本可以直接复用的缓存清没了,下次读同样的文件又得重新从磁盘加载一遍,性能反而变差,问题该在还在,只是被暂时掩盖了而已。除非是开发调试场景需要临时清一下做对比测试,日常运维不建议这么干。
如果排查下来确认available确实持续偏低、真的是内存不够用了,那时候再考虑加一块SWAP虚拟内存应急,或者干脆升级内存套餐,才是对症的做法。