服务器内存吃紧别急着加内存:用 free 和 top 找出真正的内存大户
服务器内存告警一响,很多人的第一反应是加内存。其实先别急:Linux 把空闲内存用来做缓存是正常现象,free 里 used 很高不一定是真的吃紧,真正要找的是谁在持续占用、且不释放的内存。
第一步:用 free -h 看全局
重点看 available,而不是 free。available 是在不触发 Swap 的前提下还能给新进程用的内存估算。如果 available 还很充裕,只是 buff/cache 很高,那多半是文件缓存,不必惊慌;如果 available 持续走低、Swap 开始被大量使用,才是真的吃紧。
free -h
vmstat 1
第二步:用 top 按内存排序找大户
在 top 里按 Shift+M 按内存占用排序,重点看 %MEM 和 RES。RES 是进程实际占用的物理内存,比 VIRT 更有参考价值;SHR 是共享内存,不能简单相加。先记下排在前面的进程名和 PID,再看它们是常驻服务、定时任务,还是失控的子进程。
第三步:用 ps 做二次确认
ps aux --sort=-%mem | head -20
结合业务判断:是 Java 堆设得太大、数据库缓存配得太满,还是某个进程在缓慢泄漏?如果同一进程的 RES 随时间单调上涨、重启后又从低位重新上涨,就要优先怀疑内存泄漏,而不是直接加内存。
第四步:区分缓存、共享与泄漏
cat /proc/meminfo 可以看到 Slab、PageTables 等细节。不要一上来就 echo 3 > /proc/sys/vm/drop_caches,那只是把缓存清掉,治标不治本,还可能让后续读盘变慢。
最后再决定怎么办
如果是配置问题,就调小堆内存、连接池或数据库缓存上限;如果是泄漏,就修代码、限制重启策略、加监控告警;只有在业务确实增长、available 长期不足、且已排除泄漏和配置问题后,再考虑加内存或扩容。先定位大户,再花钱扩容,才是省钱又稳妥的做法。
- 点赞
- 收藏
- 关注作者
评论(0)