前言
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),说明内存紧张,可能需要清理缓存或升级内存; - 如果
Swap
的used
大于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内存状态,适合需要"长期观察内存变化"的场景(比如监控某程序运行时的内存消耗)。
五、内存排查思路
按"先整体、再细节、后长期"的思路来,效率更高:
- 第一步:用free快速判断"内存够不够"
先输free -h
,看available
(可用内存)占比------大于20%说明内存充足;小于10%说明紧张,需要进一步排查。 - 第二步:用vmstat找"瓶颈在哪"
如果free显示内存紧张,输vmstat 5 3
,看swap的si/so(是不是备用仓库在用)、procs的r/b(进程有没有排队)、IO的wa(是不是IO拖慢)------定位是纯内存问题,还是内存+CPU/IO的混合问题。 - 第三步:用sar做"长期监控"
如果想跟踪某程序(比如新上线的APP)的内存消耗,输sar -r 3
,持续观察内存变化,看程序是否有"内存泄露"(用着用着内存越来越少)。
很多云服务商还会简化这个过程,比如非凡云的Linux服务器,会把核心数据整合到管理后台,不仅有实时图表,还有"内存告警",手机就能收到提醒。
六、总结
free
、vmstat
、sar
这三个命令用途:
free
是"快速查看"vmstat
是"全面排查"sar
是"长期监控"