Linux运维必备:3个内存问题排查命令

前言

Linux服务器如果出现程序突然卡得动不了,但是日志没报错,CPU也没跑满,这很有可能就是内存的问题。只要掌握free、vmstat、sar这3个命令,就像给电脑做"体检"一样,几分钟就能定位问题所在。

一、为什么要排查内存?

内存就像服务器的"临时工作台"------程序运行时会把数据放到内存里,方便快速调用。如果内存不够,程序要么"挤不下"崩溃,要么得去磁盘的"备用仓库"(swap)取数据,而磁盘速度比内存慢100倍以上,自然会卡顿。

二、free 命令

free命令是内存排查的"入门款",能快速知道"总内存有多少、用了多少、还剩多少",操作最简单。

1. 一行代码搞定

在Linux终端输入以下命令,就能查看内存状态:

bash 复制代码
free

如果想让结果更"人性化"(比如用GB/MB显示,不用记KB),加-h参数;想每隔几秒刷新一次(比如3秒),加-s 3参数:

bash 复制代码
free -h -s 3

2. 怎么看懂结果?

free输出的核心字段,每个都像仓库的"收支数据":

  • Mem :物理内存的"主仓库",是程序最常用的空间;
    • total:主仓库总容量(比如1.9GB);
    • used:已用容量(比如298MB);
    • free:完全没用到的"空仓库"(比如814MB)------注意:不是"真正可用",因为还要算缓冲和缓存;
    • buff/cache:"临时存储区",像仓库的"暂存架":
      • buff(缓冲区):刚从磁盘接收的数据,先放这整理(比如刚下载的文件碎片),像快递站的"待分拣区";
      • cache(缓存区):频繁访问的文件/数据,放这方便快速调用(比如常用的程序代码),像家里的"常用物品柜";
    • available:真正能给新程序用的内存(≈free + buff/cache),比如1.6GB------这个值最重要,低于total 的10%就说明内存快不够了。
  • Swap:内存的"备用仓库"(磁盘空间),主仓库满了才用,速度慢。

3. 实际场景:10秒判断内存够不够

  • 比如用free -h看到available只有100MB(总内存1.9GB),说明内存紧张,可能需要清理缓存或升级内存;
  • 如果Swapused大于0,且持续增加,说明主仓库不够用,已经开始用备用仓库了,得赶紧排查原因。

很多云服务商为了方便新手,会把 used 的数据做成可视化图表,比如非凡云的云服务器管理后台,就能直接看到 used 内存的实时曲线,鼠标放上去还能看到各时间段的具体数值,对不熟悉命令的朋友很友好。

三、vmstat 命令------内存+CPU+IO"全面体检"(推荐)

vmstat就像是服务器的"全面体检报告"------不仅能看内存,还能查CPU、IO的状态,是Linux运维的"明星命令"。

1. 怎么用?定期统计更实用

在终端输入命令,比如"每隔5秒统计一次,共统计3次":

bash 复制代码
vmstat 5 3

参数解释:第一个数字(5)是"统计间隔(秒)",第二个数字(3)是"统计次数";如果只输vmstat,会只统计一次当前状态。

2. 怎么看懂结果?

vmstat的输出字段多,但按"模块"理解就简单,每个模块对应一个性能维度:

(1)procs:看"进程排队"情况
  • r:正在运行+等待CPU的进程数------如果这个数长期大于服务器CPU核心数(比如4核CPU,r长期大于4),说明CPU不够用,进程要排队;
  • b:等待资源的进程数(比如等内存、等磁盘IO)------这个数大于0说明有进程"卡壳"了。
(2)memory:看内存"主仓库+备用仓库"
  • swpd:备用仓库(Swap)用了多少(KB)------如果这个数大于0,说明主仓库不够用了,开始用备用仓库;长期大于0且增加,就得升级内存或杀无用进程;
  • free:主仓库空容量;
  • buff:缓冲区容量(快递待分拣区);
  • cache:缓存区容量(常用物品柜),如果值非常大说明缓存文件比较多,而如果此时 io 中的 bi 比较小,就说明文件系统效率比较好。
(3)swap:看备用仓库"存取速度"
  • si:每秒从备用仓库(磁盘)读入内存的数据量(KB)------从备用仓库往主仓库运货;
  • so:每秒从内存写入备用仓库的数据量(KB)------主仓库放不下,往备用仓库运货;
    重点:正常情况下si、so都该是0;如果长期大于0(比如持续5分钟都有数值),说明主仓库严重不足,必须解决(升级内存或查内存泄露)。
(4)io:看磁盘"读写速度"
  • bi:每秒从磁盘读入数据量(KB);
  • bo:每秒写入磁盘数据量(KB);
    如果bi+bo很大,且后面的wa(IO等待CPU时间)大于20%,说明磁盘IO是瓶颈,内存再大也会卡顿。
(5)system:看系统内核"消耗的CPU"
  • in:表示某一时间间隔内观测到的每秒设备终端数。
  • cs:表示每秒产生的上下文切换次数,这个值要越小越好,太大了,就表示你的CPU大部分浪费在上下文切换,CPU没有充分利用,因此要考虑调低线程或者进程的数目。 注意:这两个值越大,则由内核消耗的CPU就越多。
(6)CPU:看CPU"干活情况"
  • us:用户程序用的CPU时间占比------比如订单系统、网页服务这些业务程序;长期大于50%,要优化程序或算法;
  • sy:系统内核用的CPU时间占比------比如内存管理、磁盘IO这些系统操作;us+sy最好小于80%,否则CPU不够用;
  • id:表示CPU处在空间状态的时间百分比。
  • wa:表示IO等待所占用的CPU时间百分比,大于20%说明IO太慢,拖慢整体速度。引起I/O等待的原因可能是磁盘大量随机读写造成的,也可能是磁盘或者监控器的贷款瓶颈(主要是块操作)造成的。

3. 实际场景:找"内存+CPU+IO"的连环瓶颈

比如某服务器用vmstat 5 3发现:swpd=1GB(备用仓库在用)、si=50KB/s(持续读备用仓库)、wa=25%(IO等得久)------说明内存不够,导致用备用仓库,而备用仓库在磁盘,IO又慢,最后CPU等着IO,形成"连环瓶颈",这时要先加内存,再查磁盘IO。

四、sar 命令------内存状态"定期复查"

sar 命令像内存的"定期复查记录",功能和free类似,但更适合"长期监控"------比如想每隔3秒看一次内存变化,不用手动刷新,输入命令就能自动持续输出。

1.如何使用?

输入以下命令,每隔3秒输出一次内存信息(按Ctrl+C停止):

bash 复制代码
sar -r 3

参数-r表示"查看内存使用率相关统计",后面的"3"是统计间隔(秒)。

2. 结果怎么看?和free"互通"

sar的输出字段和free核心含义一致,比如kbmemfree(空闲内存)、kbmemused(已用内存)、kbbuffers(缓冲区)、kbcached(缓存区),只是显示格式不同,用sar也能快速get内存状态,适合需要"长期观察内存变化"的场景(比如监控某程序运行时的内存消耗)。

五、内存排查思路

按"先整体、再细节、后长期"的思路来,效率更高:

  1. 第一步:用free快速判断"内存够不够"
    先输free -h,看available(可用内存)占比------大于20%说明内存充足;小于10%说明紧张,需要进一步排查。
  2. 第二步:用vmstat找"瓶颈在哪"
    如果free显示内存紧张,输vmstat 5 3,看swap的si/so(是不是备用仓库在用)、procs的r/b(进程有没有排队)、IO的wa(是不是IO拖慢)------定位是纯内存问题,还是内存+CPU/IO的混合问题。
  3. 第三步:用sar做"长期监控"
    如果想跟踪某程序(比如新上线的APP)的内存消耗,输sar -r 3,持续观察内存变化,看程序是否有"内存泄露"(用着用着内存越来越少)。

很多云服务商还会简化这个过程,比如非凡云的Linux服务器,会把核心数据整合到管理后台,不仅有实时图表,还有"内存告警",手机就能收到提醒。

六、总结

freevmstatsar 这三个命令用途:

  • free 是"快速查看"
  • vmstat 是"全面排查"
  • sar 是"长期监控"
相关推荐
铭哥的编程日记2 小时前
【Linux】Ext系列文件系统
linux·服务器
神秘人X7072 小时前
Keepalived 高可用配置文档
linux·keepalived·高可用
失因2 小时前
Nginx 特性、配置与实战部署
运维·数据库·nginx
云动雨颤2 小时前
程序出错瞎找?教你写“会说话”的错误日志,秒定位原因
java·运维·php
霖.242 小时前
四种常用SVC(service)及其与Ingress协作方式
linux·服务器·云原生·kubernetes·k8s
程序员果子3 小时前
Kafka 深度剖析:架构演进、核心概念与设计精髓
大数据·运维·分布式·中间件·架构·kafka
songyuc3 小时前
【Ubuntu】请问,『kill -9』跟『kill -15』有区别吗?
linux·ubuntu
苹果醋33 小时前
SpringCloud高可用集群搭建及负载均衡配置实战
java·运维·spring boot·mysql·nginx
iconball3 小时前
个人用云计算学习笔记 --15. (Linux 系统启动原理、Linux 防火墙管理))
linux·运维·笔记·学习·云计算