1. 程式人生 > 實用技巧 >Linux系統監控命令詳解

Linux系統監控命令詳解

1. top命令

top命令經常用來監控Linux的系統狀況,比如cpu、記憶體的使用,程式設計師基本都知道這個命令,但比較奇怪的是能用好它的人卻很少,例如top監控檢視中記憶體數值的含義就有不少的曲解。

輸入top命令

1.1 系統執行時間和平均負載:



top命令的頂部顯示與uptime命令相似的輸出 這些欄位顯示:
  • 當前時間
  • 系統已執行的時間
  • 當前登入使用者的數量
  • 相應最近5、10和15分鐘內的平均負載。

可以使用'l'命令切換uptime的顯示。

21:45:11 — 當前系統時間
0 days, 4:54 — 系統已經運行了4小時54分鐘(在這期間沒有重啟過)
2 users — 當前有2個使用者登入系統
load average:0.24, 0.15, 0.19 — load average後面的三個數分別是5分鐘、10分鐘、15分鐘的負載情況。

load average資料是每隔5秒鐘檢查一次活躍的程序數,然後按特定演算法計算出的數值。如果這個數除以邏輯CPU的數量,結果高於5的時候就表明系統在超負荷運轉了。

1.2 任務:

Tasks — 任務(程序),系統現在共有144個程序,其中處於執行中的有1個,143個在休眠(sleep),stoped狀態的有0個,zombie狀態(殭屍)的有0個。 第二行顯示的是任務或者程序的總結。程序可以處於不同的狀態。這裡顯示了全部程序的數量。除此之外,還有正在執行、睡眠、停止、殭屍程序的數量(殭屍是一種程序的狀態)。這些程序概括資訊可以用't'切換顯示

1.3 CPU 狀態:

這裡顯示不同模式下所佔cpu時間百分比,這些不同的cpu時間表示:
  • us, user: 執行(未調整優先順序的) 使用者程序的CPU時間
  • sy,system: 執行核心程序的CPU時間
  • ni,niced:執行已調整優先順序的使用者程序的CPU時間
  • wa,IO wait: 用於等待IO完成的CPU時間
  • hi:處理硬體中斷的CPU時間
  • si: 處理軟體中斷的CPU時間
  • st:這個虛擬機器被hypervisor偷去的CPU時間(譯註:如果當前處於一個hypervisor下的vm,實際上hypervisor也是要消耗一部分CPU處理時間的)。

可以使用't'命令切換顯示。

1.3% us — 使用者空間佔用CPU的百分比。
1.0% sy — 核心空間佔用CPU的百分比。
0.0% ni — 改變過優先順序的程序佔用CPU的百分比
97.3% id — 空閒CPU百分比
0.0% wa — IO等待佔用CPU的百分比
0.3% hi — 硬中斷(Hardware IRQ)佔用CPU的百分比
0.0% si — 軟中斷(Software Interrupts)佔用CPU的百分比

在這裡CPU的使用比率和windows概念不同,如果你不理解使用者空間和核心空間,需要充充電了。

1.4 記憶體使用:

接下來兩行顯示記憶體使用率,有點像'free'命令。第一行是實體記憶體使用,第二行是虛擬記憶體使用(交換空間)。

實體記憶體顯示如下:全部可用記憶體、已使用記憶體、空閒記憶體、緩衝記憶體。相似地:交換部分顯示的是:全部、已使用、空閒和緩衝交換空間。

記憶體顯示可以用'm'命令切換。

509248k total — 實體記憶體總量(509M)
495964k used — 使用中的記憶體總量(495M)
13284k free — 空閒記憶體總量(13M)
25364k buffers — 快取的記憶體量 (25M)
swap交換分割槽
492536k total — 交換區總量(492M)
11856k used — 使用的交換區總量(11M)
480680k free — 空閒交換區總量(480M)
202224k cached — 緩衝的交換區總量(202M)

這裡要說明的是不能用windows的記憶體概念理解這些資料,如果按windows的方式此臺伺服器“危矣”:8G的記憶體總量只剩下530M的可用記憶體。Linux的記憶體管理有其特殊性,複雜點需要一本書來說明,這裡只是簡單說點和我們傳統概念(windows)的不同。

第四行中使用中的記憶體總量(used)指的是現在系統核心控制的記憶體數,空閒記憶體總量(free)是核心還未納入其管控範圍的數量。納入核心管理的記憶體不見得都在使用中,還包括過去使用過的現在可以被重複利用的記憶體,核心並不把這些可被重新使用的記憶體交還到free中去,因此在linux上free記憶體會越來越少,但不用為此擔心。

如果出於習慣去計算可用記憶體數,這裡有個近似的計算公式:第四行的free + 第四行的buffers + 第五行的cached,按這個公式此臺伺服器的可用記憶體:

13284+25364+202224 = 240M。

對於記憶體監控,在top裡我們要時刻監控第五行swap交換分割槽的used,如果這個數值在不斷的變化,說明核心在不斷進行記憶體和swap的資料交換,這是真正的記憶體不夠用了。

第六行是空行

1.5 各程序(任務)的狀態監控:

PID:程序ID,程序的唯一識別符號

USER:程序所有者的實際使用者名稱。

PR:程序的排程優先順序。這個欄位的一些值是'rt'。這意味這這些程序執行在實時態。

NI:程序的nice值(優先順序)。越小的值意味著越高的優先順序。負值表示高優先順序,正值表示低優先順序

VIRT:程序使用的虛擬記憶體。程序使用的虛擬記憶體總量,單位kb。VIRT=SWAP+RES

RES:駐留記憶體大小。駐留記憶體是任務使用的非交換實體記憶體大小。程序使用的、未被換出的實體記憶體大小,單位kb。RES=CODE+DATA

SHR:SHR是程序使用的共享記憶體。共享記憶體大小,單位kb

S:這個是程序的狀態。它有以下不同的值:

  • D - 不可中斷的睡眠態。
  • R – 執行態
  • S – 睡眠態
  • T – 被跟蹤或已停止
  • Z – 殭屍態

%CPU:自從上一次更新時到現在任務所使用的CPU時間百分比。

%MEM:程序使用的可用實體記憶體百分比。

TIME+:任務啟動後到現在所使用的全部CPU時間,精確到百分之一秒。

COMMAND:執行程序所使用的命令。程序名稱(命令名/命令列)

還有許多在預設情況下不會顯示的輸出,它們可以顯示程序的頁錯誤、有效組和組ID和其他更多的資訊。

2.vmstat命令

vmstat命令是最常見的Linux/Unix監控工具,可以展現給定時間間隔的伺服器的狀態值,包括伺服器的CPU使用率,記憶體使用,虛擬記憶體交換情況,IO讀寫情況。這個命令是我檢視Linux/Unix最喜愛的命令,一個是Linux/Unix都支援,二是相比top,我可以看到整個機器的CPU,記憶體,IO的使用情況,而不是單單看到各個程序的CPU使用率和記憶體使用率(使用場景不一樣)。

一般vmstat工具的使用是通過兩個數字引數來完成的,第一個引數是取樣的時間間隔數,單位是秒,第二個引數是取樣的次數,如:

root@ubuntu:~# vmstat 2 1
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
1 0 0 3498472 315836 3819540 0 0 0 1 2 0 0 0 100 0

2表示每個兩秒採集一次伺服器狀態,1表示只採集一次。

實際上,在應用過程中,我們會在一段時間內一直監控,不想監控直接結束vmstat就行了,例如:

root@ubuntu:~# vmstat 2  
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
1 0 0 3499840 315836 3819660 0 0 0 1 2 0 0 0 100 0
0 0 0 3499584 315836 3819660 0 0 0 0 88 158 0 0 100 0
0 0 0 3499708 315836 3819660 0 0 0 2 86 162 0 0 100 0
0 0 0 3499708 315836 3819660 0 0 0 10 81 151 0 0 100 0
1 0 0 3499732 315836 3819660 0 0 0 2 83 154 0 0 100 0

這表示vmstat每2秒採集資料,一直採集,直到我結束程式,這裡採集了5次資料我就結束了程式。

好了,命令介紹完畢,現在開始實戰講解每個引數的意思。

r表示執行佇列(就是說多少個程序真的分配到CPU),我測試的伺服器目前CPU比較空閒,沒什麼程式在跑,當這個值超過了CPU數目,就會出現CPU瓶頸了。這個也和top的負載有關係,一般負載超過了3就比較高,超過了5就高,超過了10就不正常了,伺服器的狀態很危險。top的負載類似每秒的執行佇列。如果執行佇列過大,表示你的CPU很繁忙,一般會造成CPU使用率很高。

b表示阻塞的程序,這個不多說,程序阻塞,大家懂的。

swpd虛擬記憶體已使用的大小,如果大於0,表示你的機器實體記憶體不足了,如果不是程式記憶體洩露的原因,那麼你該升級記憶體了或者把耗記憶體的任務遷移到其他機器。

free 空閒的實體記憶體的大小,我的機器記憶體總共8G,剩餘3415M。

buff Linux/Unix系統是用來儲存,目錄裡面有什麼內容,許可權等的快取,我本機大概佔用300多M

cachecache直接用來記憶我們開啟的檔案,給檔案做緩衝,我本機大概佔用300多M(這裡是Linux/Unix的聰明之處,把空閒的實體記憶體的一部分拿來做檔案和目錄的快取,是為了提高 程式執行的效能,當程式使用記憶體時,buffer/cached會很快地被使用。)

si每秒從磁碟讀入虛擬記憶體的大小,如果這個值大於0,表示實體記憶體不夠用或者記憶體洩露了,要查詢耗記憶體程序解決掉。我的機器記憶體充裕,一切正常。

so每秒虛擬記憶體寫入磁碟的大小,如果這個值大於0,同上。

bi塊裝置每秒接收的塊數量,這裡的塊裝置是指系統上所有的磁碟和其他塊裝置,預設塊大小是1024byte,我本機上沒什麼IO操作,所以一直是0,但是我曾在處理拷貝大量資料(2-3T)的機器上看過可以達到140000/s,磁碟寫入速度差不多140M每秒

bo塊裝置每秒傳送的塊數量,例如我們讀取檔案,bo就要大於0。bi和bo一般都要接近0,不然就是IO過於頻繁,需要調整。

in每秒CPU的中斷次數,包括時間中斷

cs每秒上下文切換次數,例如我們呼叫系統函式,就要進行上下文切換,執行緒的切換,也要程序上下文切換,這個值要越小越好,太大了,要考慮調低執行緒或者程序的數目,例如在apache和nginx這種web伺服器中,我們一般做效能測試時會進行幾千併發甚至幾萬併發的測試,選擇web伺服器的程序可以由程序或者執行緒的峰值一直下調,壓測,直到cs到一個比較小的值,這個程序和執行緒數就是比較合適的值了。系統呼叫也是,每次呼叫系統函式,我們的程式碼就會進入核心空間,導致上下文切換,這個是很耗資源,也要儘量避免頻繁呼叫系統函式。上下文切換次數過多表示你的CPU大部分浪費在上下文切換,導致CPU幹正經事的時間少了,CPU沒有充分利用,是不可取的。

us使用者CPU時間,我曾經在一個做加密解密很頻繁的伺服器上,可以看到us接近100,r執行佇列達到80(機器在做壓力測試,效能表現不佳)。

sy系統CPU時間,如果太高,表示系統呼叫時間長,例如是IO操作頻繁。

id空閒 CPU時間,一般來說,id + us + sy = 100,一般我認為id是空閒CPU使用率,us是使用者CPU使用率,sy是系統CPU使用率。

wt等待IO CPU時間。

3.mpstat命令

mpstat是Multiprocessor Statistics的縮寫,是實時系統監控工具。其報告與CPU的一些統計資訊,這些資訊存放在/proc/stat檔案中。在多CPUs系統裡,其不但能檢視所有CPU的平均狀況資訊,而且能夠檢視特定CPU的資訊。mpstat最大的特點是:可以檢視多核心cpu中每個計算核心的統計資料;而類似工具vmstat只能檢視系統整體cpu情況。

語法

mpstat [-P {|ALL}] [internal [count]]
引數 解釋
-P {|ALL} 表示監控哪個CPU, cpu在[0,cpu個數-1]中取值
internal 相鄰的兩次取樣的間隔時間、
count 取樣的次數,count只能和delay一起使用
當沒有引數時,mpstat則顯示系統啟動以後所有資訊的平均值。有interval時,第一行的資訊自系統啟動以來的平均資訊。從第二行開始,輸出為前一個interval時間段的平均資訊。

例項

檢視多核CPU核心的當前執行狀況資訊, 每2秒更新一次

mpstat  219:45:12 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle
19:45:14 all 0.04 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.96
19:45:16 all 0.00 0.00 0.00 0.03 0.00 0.00 0.00 0.00 99.97
19:45:18 all 0.00 0.07 0.07 0.00 0.00 0.00 0.00 0.00 99.87

如果要看每個cpu核心的詳細當前執行狀況資訊,輸出如下:

mpstat  -P ALL 2

19:43:58     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
19:43:59     all    0.00    0.00    0.04    0.00    0.00    0.00    0.00    0.00   99.96
19:43:59       0    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
19:43:59       1    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
.......
19:43:59      13    0.99    0.00    0.00    0.00    0.00    0.00    0.00    0.00   99.01
19:43:59      14    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
19:43:59      15    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00

欄位的含義如下

%user      在internal時間段裡,使用者態的CPU時間(%),不包含nice值為負程序  (usr/total)*100
%nice      在internal時間段裡,nice值為負程序的CPU時間(%)   (nice/total)*100
%sys       在internal時間段裡,核心時間(%)       (system/total)*100
%iowait    在internal時間段裡,硬碟IO等待時間(%) (iowait/total)*100
%irq       在internal時間段裡,硬中斷時間(%)     (irq/total)*100
%soft      在internal時間段裡,軟中斷時間(%)     (softirq/total)*100
%idle      在internal時間段裡,CPU除去等待磁碟IO操作外的因為任何原因而空閒的時間閒置時間(%) (idle/total)*100

計算公式如下

total_cur=user+system+nice+idle+iowait+irq+softirq
total_pre=pre_user+ pre_system+ pre_nice+ pre_idle+ pre_iowait+ pre_irq+ pre_softirq
user=user_cur – user_pre
total=total_cur-total_pre
其中_cur 表示當前值,_pre表示interval時間前的值。上表中的所有值可取到兩位小數點。