linux系統監控、診斷工具之top詳解
接觸 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, 88024k free, 25068k buffers
Swap: 524280k total, 0k used, 524280k free, 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 ,基本可以判斷已經遇到內存瓶頸了,要麼優化你的代碼,要麼加內存。
(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 ,一個更加強大的交互式進程管理器: