楔子: 學會靈活使用各種或工具或手段來監測自己的項目運行情況無疑是一種自我能力的提高。Linux top 命令也許會有所幫助。
Linux top 命令
Linux top 命令是服務器工程師和運維最常用的工具之一,它所帶出來的信息可以有效的觀察和監測當前服務器的各項性能,如系統CPU、內存、運行時間、執行的進程等信息,這可以實時有效的發現服務器運載能力或缺陷出在哪裏。如內存不夠、CPU處理能力不夠、IO讀寫過高等等。就像 Windows 的任務管理器。
[devuser@ping-test8264 logs]$ top
top - 14:36:45 up 12 days, 3:16, 1 user, load average: 0.66, 0.67, 0.63
Tasks: 91 total, 1 running, 89 sleeping, 1 stopped, 0 zombie
Cpu(s): 40.3%us, 0.3%sy, 0.0%ni, 59.4%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 2045940k total, 2027396k used, 18544k free, 87148k buffers
Swap: 1048572k total, 7472k used, 1041100k free, 110292k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
28132 ping 20 0 2927m 1.7g 6728 S 81.1 85.5 780:26.52 java
30846 root 20 0 323m 10m 3216 S 0.3 0.5 27:33.91 ops-agent
1 root 20 0 19236 1252 1112 S 0.0 0.1 0:00.37 init
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
3 root RT 0 0 0 0 S 0.0 0.0 0:04.29 migration/0
4 root 20 0 0 0 0 S 0.0 0.0 0:10.99 ksoftirqd/0
5 root RT 0 0 0 0 S 0.0 0.0 0:00.00 stopper/0
6 root RT 0 0 0 0 S 0.0 0.0 0:02.32 watchdog/0
7 root RT 0 0 0 0 S 0.0 0.0 0:04.43 migration/1
8 root RT 0 0 0 0 S 0.0 0.0 0:00.00 stopper/1
9 root 20 0 0 0 0 S 0.0 0.0 0:09.90 ksoftirqd/1
10 root RT 0 0 0 0 S 0.0 0.0 0:02.24 watchdog/1
11 root 20 0 0 0 0 S 0.0 0.0 1:12.45 events/0
12 root 20 0 0 0 0 S 0.0 0.0 1:20.05 events/1
13 root 20 0 0 0 0 S 0.0 0.0 0:00.00 events/0
14 root 20 0 0 0 0 S 0.0 0.0 0:00.00 events/1
15 root 20 0 0 0 0 S 0.0 0.0 0:00.00 events_long/0
16 root 20 0 0 0 0 S 0.0 0.0 0:00.00 events_long/1
17 root 20 0 0 0 0 S 0.0 0.0 0:00.00 events_power_ef
18 root 20 0 0 0 0 S 0.0 0.0 0:00.00 events_power_ef
19 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cgroup
20 root 20 0 0 0 0 S 0.0 0.0 0:00.00 khelper
21 root 20 0 0 0 0 S 0.0 0.0 0:00.00 netns
22 root 20 0 0 0 0 S 0.0 0.0 0:00.00 async/mgr
23 root 20 0 0 0 0 S 0.0 0.0 0:00.00 pm
24 root 20 0 0 0 0 S 0.0 0.0 0:00.00 xenwatch
25 root 20 0 0 0 0 S 0.0 0.0 0:01.69 xenbus
26 root 20 0 0 0 0 S 0.0 0.0 0:05.78 sync_supers
27 root 20 0 0 0 0 S 0.0 0.0 0:00.11 bdi-default
28 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kintegrityd/0
29 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kintegrityd/1
30 root 20 0 0 0 0 S 0.0 0.0 0:06.56 kblockd/0
31 root 20 0 0 0 0 S 0.0 0.0 0:00.90 kblockd/1
32 root 20 0 0 0 0 S 0.0 0.0 0:00.00 ata_aux
33 root 20 0 0 0 0 S 0.0 0.0 0:00.00 ata_sff/0
34 root 20 0 0 0 0 S 0.0 0.0 0:00.00 ata_sff/1
35 root 20 0 0 0 0 S 0.0 0.0 0:00.00 ksuspend_usbd
36 root 20 0 0 0 0 S 0.0 0.0 0:00.00 khubd
信息拆解
命令行:top 命令
[devuser@ping-test8264 logs]$ top
第一行:系統概覽
top - 14:36:45 up 12 days, 3:16, 1 user, load average: 0.66, 0.67, 0.63
分別對應顯示:系統當前時間 up 系統到目前爲止運行的時間,當前登錄用戶數,以及負載均衡情況:
14:36:45 |
當前時間 |
up 12 days, 3:16 |
系統運行時間,格式爲時:分(系統當前已經運行了12天3小時16分鐘) |
1 user |
當前登錄用戶數 |
load average: 0.66, 0.67, 0.63 |
系統負載情況,即任務隊列的平均長度。 三個數值分別爲 1分鐘、5分鐘、15分鐘 前到現在的平均值 |
注意:load average 數據是每隔5秒鐘檢查一次活躍的進程數,然後按特定算法計算出的數值。如果這個數除以邏輯CPU的數量,結果高於5的時候就表明系統在超負荷運轉了。
第二行:任務統計
Tasks: 91 total, 1 running, 89 sleeping, 1 stopped, 0 zombie
分別對應顯示:當前任務總數,前正在運行的任務數,當前正在休眠的任務數,當前已經停止的任務數,殭屍進程數
91 total |
當前任務(進程)總數 |
1 running |
當前正在運行的任務(進程)數 |
89 sleeping |
當前正在休眠的任務(進程)數 |
1 stopped |
當前已經停止的任務(進程)數 |
0 zombie |
當前殭屍任務(進程)數 |
第三行:CPU狀態
Cpu(s): 40.3%us, 0.3%sy, 0.0%ni, 59.4%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
分別對應顯示:
40.3%us |
用戶空間佔用CPU百分比 |
0.3%sy |
內核空間佔用CPU百分比 |
0.0%ni |
用戶進程空間內改變過優先級的進程佔用CPU百分比 |
59.4%id |
空閒CPU百分比 |
0.0%wa |
等待輸入輸出的CPU時間百分比 |
0.0%hi | Hardware IRQ 硬中斷 佔用CPU的百分比 |
0.0%si | Software 軟中斷 佔用CPU的百分比 |
0.0%st | 被 hypervisor 偷去的時間(虛擬機佔用時間比例) |
第四行:內存狀態
Mem: 2045940k total, 2027396k used, 18544k free, 87148k buffers
分別對應顯示:物理內存總量 2G,使用中的內存總量 2G,空閒內存總量 18M,緩衝內存量 85M
2045940k total |
物理內存總量 |
2027396k used |
使用的物理內存總量 |
18544k free |
空閒內存總量 |
87148k buffers |
用作內核緩存的內存量 |
注:使用中的內存總量(used)指的是現在系統內核控制的內存數,空閒內存總量(free)是內核還未納入其管控範圍的數量。納入內核管理的內存不見得都在使用中,還包括過去使用過的現在可以被重複利用的內存,內核並不把這些可被重新使用的內存交還到 free 中去,因此在 linux 上 free 內存會越來越少,但不用爲此擔心。
第五行:交換分區狀態
Swap: 1048572k total, 7472k used, 1041100k free, 110292k cached
分別對應顯示:交換區總量 1G,使用的交換區總量 7M,空閒交換區總量 1G,緩衝的交換區總量 0.1G
1048572k total |
交換區總量 |
7472k used |
使用的交換區總量 |
1041100k free |
空閒交換區總量 |
110292k cached |
緩衝的交換區總量。 內存中的內容被換出到交換區,而後又被換入到內存,但使用過的交換區尚未被覆蓋, 該數值即爲這些內容已存在於內存中的交換區的大小。相應的內存再次被換出時可不必再對交換區寫入。 |
注:對於內存監控,在 top 裏我們要時刻監控第五行 swap 交換分區的 used,如果這個數值在不斷的變化,說明內核在不斷進行內存和 swap 的數據交換,這是真正的內存不夠用了。
第六行:空行
第七行:各進程的監控表頭
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
對應表頭信息如下:
PID | 進程唯一ID標識 |
USER | 啓動此進程的用戶 |
PR | 進程優先級 |
NI | 進程nice值(與PR相加爲0,NI值越小進程優先級越高) |
VIRT | 進程使用的虛擬內存總量,單位kb |
RES | 進程使用的,未被換出的內存大小,單位kb |
SHR | 共享內存大小,單位kb |
S | 進程狀態(D=不可中斷的睡眠狀態,R=運行,S=睡眠,T=跟蹤/停止,Z=殭屍進程) |
%CPU | 進程佔用CPU資源比例 |
%MEM | 進程佔用內存大小比例 |
TIME+ | 進程佔用系統內核時間,單位1/100秒 |
COMMAND | 進程名稱(命令名/命令行) |
脫坑技巧
1)在使用 top 命令過程中,有時希望界面停止滾動來捕捉一些特定的進程信息,這時可以使用 ctrl+s 凍結屏幕,在得到我們需要的信息後按 ctrl+q 解除屏幕凍結。
2)監控 Java 線程數(如果不加後面的 wc -l 來只顯示當前 Java 線程個數,會很容易被刷屏):
ps -eLf | grep java | wc -l
3)命令 pmap,輸出某個進程內存的狀況,可以用來分析線程堆棧:
pmap PID