Linux 服务器内存飙高:从 free 到进程定位的排查路径

举报
yd_283936595 发表于 2026/11/07 10:26:45 2026/11/07
【摘要】 先分清 Used、buff/cache 和 availablefree -h 里 Used 偏高不一定是坏事。Linux 会把空闲内存拿去做页缓存,加速读盘,所以 buff/cache 占一大块很正常。真正该盯的是 available:它估算「再不挤缓存还能给新进程多少」。available 接近零、Swap 持续上涨,才说明内存压力真实存在。同时看 vmstat 1 5:si/so 连续...

先分清 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、是否持续爬升」四项写进值班手册,下次报警就能在几分钟内判断是峰值还是泄漏,避免盲目重启。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。