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

cache cache直接用來記憶我們打開的文件,給文件做緩衝,我本機大概佔用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時間前的值。上表中的所有值可取到兩位小數點。   

 轉載:https://www.cnblogs.com/barrywxx/p/8686015.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章