-
使用SSHClient客戶端連接到遠程Linux系統。使用top命令查看系統的當前運行的情況。如圖對top命令執行的結果做了簡單的圖解,下面針對每一項做詳細的解釋。
-
- top命令的第一行“top - 19:56:47 up 39 min, 3 users, load average: 0.00, 0.00, 0.00”顯示的內容依次爲“系統當前時間 、系統到目前爲止已運行的時間、當前登錄系統的用戶數量、系統負載(任務隊列的平均長度)三個值分別爲1分鐘、5分鐘、15分鐘前到現在的平均值【這三個一般會小於1,如果持續高於5,請仔細查看那個程序影響系統的運行】”
-
- top命令的第二行“Tasks: 120 total, 2 running, 118 sleeping, 0 stopped, 0 zombie”顯示的內容依次“所有啓動的進程數”、“正在運行的進程數”、“掛起的進程數”、“停止的進程數”、“殭屍進程數”。
-
-
top命令的第三行“Cpu(s): 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st”顯示的內容依次爲“用戶空間佔用CPU百分比”、“內核空間佔用CPU百分比”、“用戶空間內改變過優先級的進程佔用CPU百分比”、“空閒CPU百分比”、“等待輸入輸出CPU時間百分比”、“CPU服務於硬件中斷所耗費的時間總額”、“CPU服務軟中斷所耗費的時間總額”、“Steal Time”
- top命令第四行“Mem: 508820k total, 480172k used, 28648k free, 41944k buffers”顯示內容依次爲“物理內存總量”、“已使用的物理內存”、“空閒物理內存”、“內核緩存內存量”。
-
-
top命令第5行“Swap: 392184k total, 0k used, 392184k free, 259152k cached”顯示內容依次爲“交換區總量”、“已使用交互區總量”、“空閒交換區總量”、“緩衝的交換區總量”。
-
top命令第5行“PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND ”顯示內容依次爲“進程ID”、“進程所有者”、“優先級”、“nice值,負值表示高優先級,正值表示低優先級”、“進程使用的虛擬內存總量”、“進程使用的、未被換出的物理內存大小”、“共享內存大小”、“進程狀態”、“上次更新到現在的CPU時間佔用百分比”、“進程使用的物理內存百分比”、“進程使用CPU總時間”、“命令名、命令行”。
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 若該進程在睡眠,則顯示睡眠中的系統函數名
解釋一下Linux上free命令的輸出。
下面是free的運行結果,一共有4行。爲了方便說明,我加上了列號。這樣可以把free的輸出看成一個二維數組FO(Free Output)。例如:
- FO[2][1] = 24677460
- FO[3][2] = 10321516
1 total used free shared buffers cached
2 Mem: 24677460 23276064 1401396 0 870540 12084008
3 -/+ buffers/cache: 10321516 14355944
4 Swap: 25151484 224188 24927296
free的輸出一共有四行,第四行爲交換區的信息,分別是交換的總量(total),使用量(used)和有多少空閒的交換區(free),這個比較清楚,不說太多。
free輸出地第二行和第三行是比較讓人迷惑的。這兩行都是說明內存使用情況的。第一列是總量(total),第二列是使用量(used),第三列是可用量(free)。
第一行的輸出時從操作系統(OS)來看的。也就是說,從OS的角度來看,計算機上一共有:
- 24677460KB(缺省時free的單位爲KB)物理內存,即FO[2][1];
- 在這些物理內存中有23276064KB(即FO[2][2])被使用了;
- 還用1401396KB(即FO[2][3])是可用的;
這裏得到第一個等式:
- FO[2][1] = FO[2][2] + FO[2][3]
FO[2][4]表示被幾個進程共享的內存的,現在已經deprecated,其值總是0(當然在一些系統上也可能不是0,主要取決於free命令是怎麼實現的)。
FO[2][5]表示被OS buffer住的內存。FO[2][6]表示被OS cache的內存。在有些時候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.
也就是說buffer是用於存放要輸出到disk(塊設備)的數據的,而cache是存放從disk上讀出的數據。這二者是爲了提高IO性能的,並由OS管理。
Linux和其他成熟的操作系統(例如windows),爲了提高IO read的性能,總是要多cache一些數據,這也就是爲什麼FO[2][6](cached memory)比較大,而FO[2][3]比較小的原因。我們可以做一個簡單的測試:
- 釋放掉被系統cache佔用的數據;
echo 3>/proc/sys/vm/drop_caches
- 讀一個大文件,並記錄時間;
- 關閉該文件;
- 重讀這個大文件,並記錄時間;
第二次讀應該比第一次快很多。原來我做過一個BerkeleyDB的讀操作,大概要讀5G的文件,幾千萬條記錄。在我的環境上,第二次讀比第一次大概可以快9倍左右。
free輸出的第二行是從一個應用程序的角度看系統內存的使用情況。
- 對於FO[3][2],即-buffers/cache,表示一個應用程序認爲系統被用掉多少內存;
- 對於FO[3][3],即+buffers/cache,表示一個應用程序認爲系統還有多少內存;
因爲被系統cache和buffer佔用的內存可以被快速回收,所以通常FO[3][3]比FO[2][3]會大很多。
這裏還用兩個等式:
- FO[3][2] = FO[2][2] - FO[2][5] - FO[2][6]
- FO[3][3] = FO[2][3] + FO[2][5] + FO[2][6]
這二者都不難理解。
free命令由procps.*.rpm提供(在Redhat系列的OS上)。free命令的所有輸出值都是從/proc/meminfo中讀出的。
在系統上可能有meminfo(2)這個函數,它就是爲了解析/proc/meminfo的。procps這個包自己實現了meminfo()這個函數。可以下載一個procps的tar包看看具體實現,現在最新版式3.2.8。
類別 |
項目 |
含義 |
說明 |
Procs(進程) |
r |
等待執行的任務數 |
展示了正在執行和等待cpu資源的任務個數。當這個值超過了cpu個數,就會出現cpu瓶頸。 |
B |
等待IO的進程數量 |
|
|
Memory(內存) |
swpd |
正在使用虛擬的內存大小,單位k |
|
free |
空閒內存大小 |
|
|
buff |
已用的buff大小,對塊設備的讀寫進行緩衝 |
|
|
cache |
已用的cache大小,文件系統的cache |
|
|
inact |
非活躍內存大小,即被標明可回收的內存,區別於free和active |
具體含義見:概念補充(當使用-a選項時顯示) |
|
active |
活躍的內存大小 |
具體含義見:概念補充(當使用-a選項時顯示) |
|
Swap |
si |
每秒從交換區寫入內存的大小(單位:kb/s) |
|
so |
每秒從內存寫到交換區的大小 |
|
|
IO |
bi |
每秒讀取的塊數(讀磁盤) |
現在的Linux版本塊的大小爲1024bytes |
bo |
每秒寫入的塊數(寫磁盤) |
|
|
system |
in |
每秒中斷數,包括時鐘中斷 |
這兩個值越大,會看到由內核消耗的cpu時間會越多 |
cs |
每秒上下文切換數 |
||
CPU(以百分比表示) |
Us |
用戶進程執行消耗cpu時間(user time) |
us的值比較高時,說明用戶進程消耗的cpu時間多,但是如果長期超過50%的使用,那麼我們就該考慮優化程序算法或其他措施了 |
Sy |
系統進程消耗cpu時間(system time) |
sys的值過高時,說明系統內核消耗的cpu資源多,這個不是良性的表現,我們應該檢查原因。 |
|
Id |
空閒時間(包括IO等待時間) |
|
|
wa |
等待IO時間 |
Wa過高時,說明io等待比較嚴重,這可能是由於磁盤大量隨機訪問造成的,也有可能是磁盤的帶寬出現瓶頸。 |