在Linux服务器的运维场景中程序突然卡顿且无日志报错、CPU未跑满的情况时有发生此时内存问题往往是潜在的“罪魁祸首”。对于开发运维人员而言掌握free、vmstat、sar这三个命令就如同为服务器配备了专业的“体检工具”能够在短短几分钟内精准定位内存相关的故障根源为高效解决问题提供有力支持。一、内存排查的必要性当内存容量充足时程序能够顺畅运行然而一旦内存不足便会引发一系列问题。一方面程序可能因无法获取足够的内存空间而崩溃另一方面系统不得不借助磁盘的“备用仓库”即swap分区来存储和读取数据。但磁盘的读写速度相较于内存而言慢了100倍以上这种速度差异必然导致程序出现明显的卡顿现象严重影响服务器的性能和用户体验。二、free命令内存排查的“入门利器”free命令堪称内存排查领域的“入门款”工具它能够快速提供关于内存使用情况的基本信息让用户迅速了解服务器的内存状态。一简单操作与灵活参数在Linux终端中只需输入“free”命令即可查看内存的初始状态。若希望结果以更人性化的GB/MB为单位显示避免记忆KB数值的繁琐可添加“-h”参数若想实现每隔一定时间如3秒自动刷新内存信息可添加“-s 3”参数。具体命令如下1free-h-s3二结果解读洞察内存“收支”free命令输出的结果包含多个核心字段每个字段都如同仓库的“收支数据”反映了内存的不同使用情况Mem物理内存主仓库这是程序最常用的内存空间类似于实际工作中的主要工作区域。total表示主仓库的总容量例如1.9GB反映了服务器物理内存的总量。used显示已使用的内存容量如298MB体现了当前正在被程序占用的内存大小。free代表完全未被使用的“空仓库”容量例如814MB。但需要注意的是这个值并非真正可用的内存因为还需要考虑缓冲和缓存所占用的空间。buff/cache临时存储区这部分内存类似于仓库的“暂存架”用于临时存储数据。buff缓冲区刚从磁盘接收的数据会先存放在这里进行整理类似于快递站的“待分拣区”。例如刚下载的文件碎片会暂时存储在缓冲区等待进一步处理。cache缓存区频繁访问的文件或数据会被存放在这里以便快速调用类似于家里的“常用物品柜”。例如常用的程序代码会被缓存在此提高程序运行效率。available真正可用内存这是最为关键的指标其值大约等于free buff/cache例如1.6GB。当这个值低于total的10%时就表明内存已经接近耗尽需要及时采取措施。Swap内存备用仓库这是磁盘上划分的专门空间作为内存的备用区域。只有当主仓库物理内存满载时系统才会使用Swap分区。但由于磁盘速度远慢于内存使用Swap分区会导致性能下降。三实际场景应用快速判断内存状况通过free命令运维人员可以在10秒内快速判断内存是否充足。例如当使用“free -h”命令查看结果时如果发现available值只有100MB而总内存为1.9GB这就表明内存已经非常紧张可能需要清理缓存或考虑升级内存。另外如果Swap的used值大于0并且持续增加这说明主仓库的内存已经不够用系统开始频繁使用备用仓库此时必须尽快排查原因避免问题进一步恶化。三、vmstat命令内存CPUIO的“全面体检专家”vmstat命令犹如服务器的“全面体检报告”它不仅能够提供内存的使用情况还能同时监测CPU和IO的状态是Linux运维领域中备受推崇的“明星命令”。一使用方法定期统计精准把握在终端中输入“vmstat”命令默认会统计一次当前的系统状态。若希望实现定期统计例如每隔5秒统计一次共统计3次可使用以下命令1vmstat 5 3其中第一个数字“5”表示统计间隔秒第二个数字“3”表示统计次数。通过定期统计可以更准确地观察系统性能的变化趋势。二结果解读按模块剖析性能维度vmstat的输出字段较多但按照不同的性能维度进行模块划分后理解起来就变得相对简单。procs进程排队情况r表示正在运行以及等待CPU的进程数。如果这个数值长期大于服务器的CPU核心数例如服务器为4核CPU而r长期大于4则说明CPU资源不足进程需要排队等待处理。b代表等待资源的进程数这些资源可能包括内存、磁盘IO等。如果这个数值大于0说明有进程因为资源不足而“卡壳”无法正常执行。memory内存主仓库备用仓库swpd显示备用仓库Swap已经使用的空间大小单位KB。如果这个数值大于0说明主仓库的内存已经不够用系统开始使用备用仓库。如果swpd长期大于0且持续增加就需要考虑升级内存或者终止一些无用的进程。free表示主仓库的空闲内存容量。buff缓冲区容量类似于数据整理的“待分拣区”。cache缓存区容量类似于存放常用物品的“常用物品柜”。如果cache的值非常大而io中的bi值比较小说明文件系统的缓存效率较高能够有效地减少磁盘IO操作。swap备用仓库存取速度si每秒从备用仓库磁盘读入内存的数据量单位KB即从备用仓库往主仓库运输数据。so每秒从内存写入备用仓库的数据量单位KB即主仓库放不下数据时往备用仓库运输数据。正常情况下si和so的值都应该为0。如果这两个值长期大于0例如持续5分钟都有数值说明主仓库的内存严重不足必须采取措施解决如升级内存或检查是否存在内存泄漏问题。io磁盘读写速度bi每秒从磁盘读入的数据量单位KB。bo每秒写入磁盘的数据量单位KB。如果bi bo的值很大并且后面的waIO等待CPU时间大于20%说明磁盘IO成为了系统的瓶颈即使内存容量足够也会导致系统出现卡顿现象。system系统内核消耗的CPUin表示某一时间间隔内观测到的每秒设备终端数。cs表示每秒产生的上下文切换次数。这个值越小越好如果值过大说明CPU大部分时间浪费在上下文切换上没有得到充分利用。此时需要考虑调低线程或者进程的数目以提高CPU的使用效率。需要注意的是in和cs的值越大由内核消耗的CPU就越多。CPUCPU干活情况us用户程序使用的CPU时间占比例如订单系统、网页服务等业务程序。如果这个值长期大于50%说明用户程序对CPU的占用过高可能需要优化程序或算法。sy系统内核使用的CPU时间占比例如内存管理、磁盘IO等系统操作。us sy的值最好小于80%否则说明CPU资源不足无法满足系统运行的需求。id表示CPU处于空闲状态的时间百分比。wa表示IO等待所占用的CPU时间百分比。如果wa大于20%说明IO操作过慢拖慢了整个系统的速度。引起I/O等待的原因可能是磁盘大量随机读写造成的也可能是磁盘或者监控器的带宽瓶颈主要是块操作导致的。