1. 程式人生 > >linux 系統監控、診斷工具之 top 詳解

linux 系統監控、診斷工具之 top 詳解

文章來源:http://my.oschina.net/leejun2005/blog/157910

接觸 linux 的人對於 top 命令可能不會陌生(不同系統名字可能不一樣,如 IBM 的 aix 中叫 topas ),它的作用主要用來監控系統實時負載率、程序的資源佔用率及其它各項系統狀態屬性是否正常。

下面我們先來看張 top 截圖:

(1)系統、任務統計資訊:

前 8 行是系統整體的統計資訊。第 1 行是任務佇列資訊,同 uptime 命令的執行結果。其內容如下:

01:06:48 當前時間
up 1:22 系統執行時間,格式為時:分
1 user 當前登入使用者數
load average: 0.06, 0.60, 0.48 系統負載,即任務佇列的平均長度。

三個數值分別為 1分鐘、5分鐘、15分鐘前到現在的平均值。

注意:這三個值可以用來判定系統是否負載過高——如果值

持續大於系統 cpu 個數,就需要優化你的程式或者架構了。

(2)程序、 cpu 統計資訊:

第 2~6 行為程序和CPU的資訊。當有多個CPU時,這些內容可能會超過兩行。內容如下:

Tasks: 29 total 程序總數
1 running 正在執行的程序數
28 sleeping 睡眠的程序數
0 stopped 停止的程序數
0 zombie 殭屍程序數
Cpu(s): 0.3% us 使用者空間佔用CPU百分比
1.0% sy 核心空間佔用CPU百分比
0.0% ni 使用者程序空間內改變過優先順序的程序佔用CPU百分比
98.7% id 空閒CPU百分比
0.0% wa 等待輸入輸出的CPU時間百分比
0.0% hi Hardware IRQ
0.0% si Software IRQ

注:

(1)IRQ: IRQ全稱為Interrupt Request,即是“中斷請求”的意思。

(2)st(Steal Time):Steal time is the percentage of time a virtual CPU waits for a real CPU while the hypervisor is servicing another virtual processor. It's only relevant in virtualized environments.

 It represents time when the real CPU was not available to the current virtual machine - it was "stolen" from that VM by the hypervisor (either to run another VM, or for its own needs).

So, relatively speaking, what does this mean? A high steal percentage may mean that you may be outgrowing your virtual machine with your hosting company. Other virtual machines may have a larger slice of the CPU’s time and you may need to ask for an upgrade in order to compete. Also, a high steal percentage may mean that your hosting company is overselling virtual machines on your particular server. If you upgrade your virtual machine and your steal percentage doesn’t drop, you may want to seek another provider. A low steal percentage can mean that your applications are working well with your current virtual machine. Since your VM is not wrestling with other VM’s constantly for CPU time, your VM will be more responsive. This may also suggest that your hosting provider is underselling their servers, which is definitely a good thing.0.0% sisi(Software Interrupts)

(3)最後兩行為記憶體資訊:

Mem: 191272k total 實體記憶體總量
173656k used 使用的實體記憶體總量
17616k free 空閒記憶體總量
22052k buffers 用作核心快取的記憶體量
Swap: 192772k total 交換區總量
0k used 使用的交換區總量
192772k free 空閒交換區總量
123988k cached 緩衝的交換區總量。
記憶體中的內容被換出到交換區,而後又被換入到記憶體,但使用過的交換區尚未被覆蓋,
該數值即為這些內容已存在於記憶體中的交換區的大小。
相應的記憶體再次被換出時可不必再對交換區寫入。

PS:如何計算可用記憶體和已用記憶體?

除了 free -m 之外,也可以看 top:

Mem:    255592k total,   167568k used,    88024free,    25068k buffers
Swap:   524280k total,        0k used,   524280free,    85724k cached

3.1  實際的程式可用記憶體數怎麼算呢?

The answer is: free + (buffers + cached)

88024k + (25068k + 85724k) = 198816k

3.2  程式已用記憶體數又怎麼算呢?

The answer is: used – (buffers + cached)

167568k – (25068k + 85724k) = 56776k

3.3  怎麼判斷系統是否記憶體不足呢?

如果你的 swap used 數值大於 0 ,基本可以判斷已經遇到記憶體瓶頸了,要麼優化你的程式碼,要麼加記憶體。

3.4  buffer 與cache 的區別

A buffer is something that has yet to be “written” to disk. A cache is something that has been “read” from the disk and stored for later use 從應用程式角度來看,buffers/cached 是等於可用的,因為buffer/cached是為了提高檔案讀寫的效能,當應用程式需在用到記憶體的時候,buffer/cached會很快地被回收。
所以從應用程式的角度來說,可用記憶體 = 系統free memory buffers cached.

buffers是指用來給塊裝置做的緩衝大小,他只記錄檔案系統的metadata以及 tracking in-flight pages.
cached是用來給檔案做緩衝。
那就是說:buffers是用來儲存,目錄裡面有什麼內容,許可權等等。
而cached直接用來記憶我們開啟的檔案,如果你想知道他是不是真的生效,你可以試一下,先後執行兩次命令#man X ,你就可以明顯的感覺到第二次的開打的速度快很多。

實驗:在一臺沒有什麼應用的機器上做會看得比較明顯。記得實驗只能做一次,如果想多做請換一個檔名。

#free
#man X
#free
#man X
#free
你可以先後比較一下free後顯示buffers的大小。
另一個實驗:
#free
#ls /dev
#free
你比較一下兩個的大小,當然這個buffers隨時都在增加,但你有ls過的話,增加的速度會變得快,這個就是buffers/chached的區別。
因為Linux將你暫時不使用的記憶體作為檔案和資料快取,以提高系統性能,當你需要這些記憶體時,系統會自動釋放(不像windows那樣,即使你有很多空閒記憶體,他也要訪問一下磁碟中的pagefiles)

(4)程序信息區:

統計資訊區域的下方顯示了各個程序的詳細資訊。首先來認識一下各列的含義。

序號 列名 含義
a PID 程序id
b PPID 父程序id
c RUSER Real user name
d UID 程序所有者的使用者id
e USER 程序所有者的使用者名稱
f GROUP 程序所有者的組名
g TTY 啟動程序的終端名。不是從終端啟動的程序則顯示為 ?
h PR 優先順序
i NI nice值。負值表示高優先順序,正值表示低優先順序
j P 最後使用的CPU,僅在多CPU環境下有意義
k %CPU 上次更新到現在的CPU時間佔用百分比
l TIME 程序使用的CPU時間總計,單位秒
m TIME+ 程序使用的CPU時間總計,單位1/100秒
n %MEM 程序使用的實體記憶體百分比
o VIRT 程序使用的虛擬記憶體總量,單位kb。VIRT=SWAP+RES
p SWAP 程序使用的虛擬記憶體中,被換出的大小,單位kb。
q RES 程序使用的、未被換出的實體記憶體大小,單位kb。RES=CODE+DATA
r CODE 可執行程式碼佔用的物理記憶體大小,單位kb
s DATA 可執行程式碼以外的部分(資料段+棧)佔用的物理記憶體大小,單位kb
t SHR 共享記憶體大小,單位kb
u nFLT 頁面錯誤次數
v nDRT 最後一次寫入到現在,被修改過的頁面數。
w S 程序狀態。
D=不可中斷的睡眠狀態
R=執行
S=睡眠
T=跟蹤/停止
Z=殭屍程序
x COMMAND 命令名/命令列
y WCHAN 若該程序在睡眠,則顯示睡眠中的系統函式名
z Flags 任務標誌,參考 sched.h

(5)檢視指定列

預設情況下僅顯示比較重要的 PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND 列。
可以通過下面的快捷鍵來更改顯示內容:

5.1 f 鍵選擇顯示內容

通過 f 鍵可以選擇顯示的內容。按 f 鍵之後會顯示列的列表,按 a-z 即可顯示或隱藏對應的列,最後按回車鍵確定。

5.2 o 鍵改變顯示順序

按 o 鍵可以改變列的顯示順序。按小寫的 a-z 可以將相應的列向右移動,而大寫的 A-Z 可以將相應的列向左移動。最後按回車鍵確定。

5.3 F/O 鍵將程序按列排序

按大寫的 F 或 O 鍵,然後按 a-z 可以將程序按照相應的列進行排序。而大寫的 R 鍵可以將當前的排序倒轉。

(6)常用交互命令

從使用角度來看,熟練的掌握這些命令比掌握選項還重要一些。這些命令都是單字母的,如果在命令列選項中使用了s選項,則可能其中一些命令會被遮蔽掉。
   Ctrl+L 擦除並且重寫螢幕。
  h或者? 顯示幫助畫面,給出一些簡短的命令總結說明。
  k 終止一個程序。系統將提示使用者輸入需要終止的程序PID,以及需要傳送給該程序什麼樣的訊號。一般的終止程序可以使用15訊號;如果不能正常結束那就使用訊號9強制結束該程序。預設值是訊號15。在安全模式中此命令被遮蔽。
  i 忽略閒置和僵死程序。這是一個開關式命令。
  q 退出程式。
  r 重新安排一個程序的優先級別。系統提示使用者輸入需要改變的程序PID以及需要設定的程序優先順序值。輸入一個正值將使優先順序降低,反之則可以使該程序擁有更高的優先權。預設值是10。
  S 切換到累計模式。
  s 改變兩次重新整理之間的延遲時間。系統將提示使用者輸入新的時間,單位為s。如果有小數,就換算成m s。輸入0值則系統將不斷重新整理,預設值是5 s。需要注意的是如果設定太小的時間,很可能會引起不斷重新整理,從而根本來不及看清顯示的情況,而且系統負載也會大大增加。
  f或者F 從當前顯示中新增或者刪除專案。
  o或者O 改變顯示專案的順序。
  l 切換顯示平均負載和啟動時間資訊。
  m 切換顯示記憶體資訊。
  t 切換顯示程序和CPU狀態資訊。
  c 切換顯示命令名稱和完整命令列。
  M 根據駐留記憶體大小進行排序。
  P 根據CPU使用百分比大小進行排序。
  T 根據時間/累計時間進行排序。
    W 將當前設定寫入~/.toprc檔案中。這是寫top配置檔案的推薦方法。

(7)最後的技能:top 命令小技巧

1、輸入大寫P,則結果按CPU佔用降序排序。
2、輸入大寫M,結果按記憶體佔用降序排序。
3、按數字 1 則可以顯示所有CPU核心的負載情況。
4、top -d 5    每隔 5 秒重新整理一次,預設 1 秒
5、top -p 4360,4358    監控指定程序
6、top -U johndoe    ‘U’為 真實/有效/儲存/檔案系統使用者名稱。
7、top -u 500    ‘u’為有效使用者標識
8、top -bn 1    顯示所有程序資訊,top -n 1 只顯示一屏資訊,供管道呼叫
9、top -M   #show memory summary in megabytes not kilobytes
10、top -p 25097 -n 1 -b    # -b 避免輸出控制字元,管道調用出現亂碼
11、top翻頁:top -bn1 | less
12、增強版的 top:htop ,一個更加強大的互動式程序管理器:

File:Htop.png

附:程序相關基礎知識

(8)Refer: