Linux服务器如果出现程序突然卡得动不了,但是日志没报错,CPU也没跑满,这很有可能就是内存的问题。只要掌握free、vmstat、sar这3个命令,就像给电脑做“体检”一样,几分钟就能定位问题所在。
内存就像服务器的“临时工作台”——程序运行时会把数据放到内存里,方便快速调用。如果内存不够,程序要么“挤不下”崩溃,要么得去磁盘的“备用仓库”(swap)取数据,而磁盘速度比内存慢100倍以上,自然会卡顿。
free
命令free命令是内存排查的“入门款”,能快速知道“总内存有多少、用了多少、还剩多少”,操作最简单。
在Linux终端输入以下命令,就能查看内存状态:
free
如果想让结果更“人性化”(比如用GB/MB显示,不用记KB),加-h
参数;想每隔几秒刷新一次(比如3秒),加-s 3
参数:
free -h -s 3
free输出的核心字段,每个都像仓库的“收支数据”:
total
:主仓库总容量(比如1.9GB); used
:已用容量(比如298MB); free
:完全没用到的“空仓库”(比如814MB)——注意:不是“真正可用”,因为还要算缓冲和缓存; buff/cache
:“临时存储区”,像仓库的“暂存架”: buff
(缓冲区):刚从磁盘接收的数据,先放这整理(比如刚下载的文件碎片),像快递站的“待分拣区”; cache
(缓存区):频繁访问的文件/数据,放这方便快速调用(比如常用的程序代码),像家里的“常用物品柜”; available
:真正能给新程序用的内存(≈free + buff/cache),比如1.6GB——这个值最重要,低于total
的10%就说明内存快不够了。 free -h
看到available
只有100MB(总内存1.9GB),说明内存紧张,可能需要清理缓存或升级内存;Swap
的used
大于0,且持续增加,说明主仓库不够用,已经开始用备用仓库了,得赶紧排查原因。很多云服务商为了方便新手,会把 used
的数据做成可视化图表,比如非凡云的云服务器管理后台,就能直接看到 used
内存的实时曲线,鼠标放上去还能看到各时间段的具体数值,对不熟悉命令的朋友很友好。
vmstat
命令——内存+CPU+IO“全面体检”(推荐)vmstat就像是服务器的“全面体检报告”——不仅能看内存,还能查CPU、IO的状态,是Linux运维的“明星命令”。
在终端输入命令,比如“每隔5秒统计一次,共统计3次”:
vmstat 5 3
参数解释:第一个数字(5)是“统计间隔(秒)”,第二个数字(3)是“统计次数”;如果只输vmstat
,会只统计一次当前状态。
vmstat的输出字段多,但按“模块”理解就简单,每个模块对应一个性能维度:
r
:正在运行+等待CPU的进程数——如果这个数长期大于服务器CPU核心数(比如4核CPU,r长期大于4),说明CPU不够用,进程要排队; b
:等待资源的进程数(比如等内存、等磁盘IO)——这个数大于0说明有进程“卡壳”了。swpd
:备用仓库(Swap)用了多少(KB)——如果这个数大于0,说明主仓库不够用了,开始用备用仓库;长期大于0且增加,就得升级内存或杀无用进程; free
:主仓库空容量; buff
:缓冲区容量(快递待分拣区); cache
:缓存区容量(常用物品柜),如果值非常大说明缓存文件比较多,而如果此时 io
中的 bi
比较小,就说明文件系统效率比较好。si
:每秒从备用仓库(磁盘)读入内存的数据量(KB)——从备用仓库往主仓库运货; so
:每秒从内存写入备用仓库的数据量(KB)——主仓库放不下,往备用仓库运货;undefined重点:正常情况下si、so都该是0;如果长期大于0(比如持续5分钟都有数值),说明主仓库严重不足,必须解决(升级内存或查内存泄露)。bi
:每秒从磁盘读入数据量(KB); bo
:每秒写入磁盘数据量(KB);undefined如果bi+bo很大,且后面的wa
(IO等待CPU时间)大于20%,说明磁盘IO是瓶颈,内存再大也会卡顿。(5)system:看系统内核“消耗的CPU”us
:用户程序用的CPU时间占比——比如订单系统、网页服务这些业务程序;长期大于50%,要优化程序或算法; sy
:系统内核用的CPU时间占比——比如内存管理、磁盘IO这些系统操作;us+sy最好小于80%,否则CPU不够用; id
:表示CPU处在空间状态的时间百分比。wa
:表示IO等待所占用的CPU时间百分比,大于20%说明IO太慢,拖慢整体速度。引起I/O等待的原因可能是磁盘大量随机读写造成的,也可能是磁盘或者监控器的贷款瓶颈(主要是块操作)造成的。比如某服务器用vmstat 5 3
发现:swpd=1GB(备用仓库在用)、si=50KB/s(持续读备用仓库)、wa=25%(IO等得久)——说明内存不够,导致用备用仓库,而备用仓库在磁盘,IO又慢,最后CPU等着IO,形成“连环瓶颈”,这时要先加内存,再查磁盘IO。
sar
命令——内存状态“定期复查”sar
命令像内存的“定期复查记录”,功能和free类似,但更适合“长期监控”——比如想每隔3秒看一次内存变化,不用手动刷新,输入命令就能自动持续输出。
输入以下命令,每隔3秒输出一次内存信息(按Ctrl+C停止):
sar -r 3
参数-r
表示“查看内存使用率相关统计”,后面的“3”是统计间隔(秒)。
sar的输出字段和free核心含义一致,比如kbmemfree
(空闲内存)、kbmemused
(已用内存)、kbbuffers
(缓冲区)、kbcached
(缓存区),只是显示格式不同,用sar也能快速get内存状态,适合需要“长期观察内存变化”的场景(比如监控某程序运行时的内存消耗)。
按“先整体、再细节、后长期”的思路来,效率更高:
free -h
,看available
(可用内存)占比——大于20%说明内存充足;小于10%说明紧张,需要进一步排查。 vmstat 5 3
,看swap的si/so(是不是备用仓库在用)、procs的r/b(进程有没有排队)、IO的wa(是不是IO拖慢)——定位是纯内存问题,还是内存+CPU/IO的混合问题。 sar -r 3
,持续观察内存变化,看程序是否有“内存泄露”(用着用着内存越来越少)。 很多云服务商还会简化这个过程,比如非凡云的Linux服务器,会把核心数据整合到管理后台,不仅有实时图表,还有“内存告警”,手机就能收到提醒。
free
、vmstat
、sar
这三个命令用途:
free
是“快速查看”vmstat
是“全面排查”sar
是“长期监控”原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。