前言
Linux服務器如果出現程序突然卡得動不了,但是日誌沒報錯,CPU也沒跑滿,這很有可能就是內存的問題。只要掌握free、vmstat、sar這3個命令,就像給電腦做“體檢”一樣,幾分鐘就能定位問題所在。
一、為什麼要排查內存?
內存就像服務器的“臨時工作台”——程序運行時會把數據放到內存裏,方便快速調用。如果內存不夠,程序要麼“擠不下”崩潰,要麼得去磁盤的“備用倉庫”(swap)取數據,而磁盤速度比內存慢100倍以上,自然會卡頓。
二、free 命令
free命令是內存排查的“入門款”,能快速知道“總內存有多少、用了多少、還剩多少”,操作最簡單。
1. 一行代碼搞定
在Linux終端輸入以下命令,就能查看內存狀態:
free
如果想讓結果更“人性化”(比如用GB/MB顯示,不用記KB),加-h參數;想每隔幾秒刷新一次(比如3秒),加-s 3參數:
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次”:
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停止):
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是“長期監控”