Linux 服务器内存飙高:从 free 到进程定位的排查路径
先分清 Used、buff/cache 和 available
free -h 里 Used 偏高不一定是坏事。Linux 会把空闲内存拿去做页缓存,加速读盘,所以 buff/cache 占一大块很正常。真正该盯的是 available:它估算「再不挤缓存还能给新进程多少」。available 接近零、Swap 持续上涨,才说明内存压力真实存在。
同时看 vmstat 1 5:si/so 连续非零说明在换页;若 CPU 的 wa 也高,磁盘和内存压力可能叠在一起。
找出真正吃内存的进程
用 ps aux --sort=-%mem | head -20 或 top 按内存排序,记下 RSS 最大的几个 PID 和命令行。注意区分:
- Java / Node 这类常驻服务:可能是堆设太大,或短时流量把缓存撑满。
- 批处理、备份、编译:短时占用高,跑完应回落;若结束后仍不降,可能有子进程残留。
- 内核 slab / 页表异常:用户态进程不大,但整体 Used 很高,需要再看
/proc/meminfo里的 Slab、PageTables。
对可疑进程看 /proc/<pid>/status 的 VmRSS、VmSwap,以及 lsof -p <pid> 是否打开了大量文件或套接字。容器场景还要进对应 cgroup 看 memory.current 与 memory.max。
区分峰值与泄漏
单次峰值:发布、全量缓存预热、报表任务,往往可预期,用限流、错峰或临时扩容即可。持续爬升:每隔几分钟采一次 RSS,画趋势;若只升不降,优先怀疑泄漏或无界缓存。
应用侧常见原因包括:未关闭的连接与 ResultSet、本地缓存没有上限与淘汰、监听器 / 线程局部变量只增不减。基础设施侧则要查是否有过多的连接池、日志缓冲、或内核网络队列把内存顶满。
处置时的纪律
先留证据再动手:保存 free、ps、/proc/meminfo 和关键应用日志。能优雅重启的服务优先滚动重启并观察是否复发;不要一上来 kill -9 一长串无关进程。临时加 Swap 只能买时间,不是根治。若是业务缓存过大,应调小堆外缓存、加淘汰策略,而不是无限加机器。
把「available、Swap、Top RSS、是否持续爬升」四项写进值班手册,下次报警就能在几分钟内判断是峰值还是泄漏,避免盲目重启。
- 点赞
- 收藏
- 关注作者
评论(0)