一、top命令介紹
top命令是Linux下常用的性能分析工具,能夠實時顯示系統中各個進程的資源占用狀況,類似於Windows的任務管理器。top命令可以動態顯示進程的資源使用情況,即可以通過用戶按鍵來不斷刷新當前狀態。如果在前台執行該命令,它將獨占前台,直到用戶終止該程序為止。比較准確的說,top命令提供了實時的對系統處理器的狀態監視,它將顯示系統中CPU最“敏感”的任務列表,該命令可以按CPU使用、內存使用和執行時間來對任務進行排序,而且該命令的很多特性都可以通過交互式命令或者在個人定制文件中進行設定。
二、top命令的參數含義
執行top命令后,默認會出現如下內容:
top – 09:36:15 up 86 days, 5:28, 1 users, load average: 0.02, 0.15, 0.22 Tasks: 194 total, 1 running, 126 sleeping, 0 stopped, 0 zombie Cpu(s): 0.3% us, 1.0% sy, 0.0% ni, 98.7% id, 0.0% wa, 0.1% hi, 0.0% si Mem: 2070564k total, 1340828k used, 729736k free, 168636k buffers Swap: 4192924k total, 0k used, 4192924k free, 894080k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1 root 20 0 1696 544 468 S 0 0.0 0:05.96 init 2 root 15 -5 0 0 0 S 0 0.0 0:00.00 kthreadd 3 root RT -5 0 0 0 S 0 0.0 0:00.10 migration/0 4 root 15 -5 0 0 0 S 0 0.0 0:00.00 ksoftirqd/0 5 root RT -5 0 0 0 S 0 0.0 0:00.74 watchdog/0 6 root RT -5 0 0 0 S 0 0.0 0:00.16 migration/1 7 root 15 -5 0 0 0 S 0 0.0 0:00.02 ksoftirqd/1
上面的內容,可以分為兩部分,第一部分是前5行,是系統整體的統計信息。第二部分是第8行開始的進程信息。我們從上往下依次進行說明:
2.1、系統整體的統計信息
- 09:36:15 當前時間
- up 86 days 系統運行了86天
- 1 user 當前登錄用戶數
- load average:0.02,0.15,0.22 系統負載,即任務隊列的平均長度。三個數值分別為 1分鍾、5分鍾、15分鍾前到現在的平均值。
第二、三行分別為進程和CPU的統計信息:
- Tasks:194 total 進程總數
- 1 running 正在運行的進程數
- 126 sleeping 睡眠的進程數
- 0 stopped 停止的進程數
- 0 zombie 僵屍進程數
- Cpu(s): 0.3% us 用戶空間占用CPU百分比
- 解釋:進程在用戶地址空間中消耗CPU時間的百分比。像shell程序、各種語言的編譯器、數據庫應用、web服務器和各種桌面應用都算是運行在用戶地址空間的進程,這些程序如果不是處於idle狀態,那么絕大多數的CPU時間都是運行在用戶態。
- 解釋:進程在用戶地址空間中消耗CPU時間的百分比。像shell程序、各種語言的編譯器、數據庫應用、web服務器和各種桌面應用都算是運行在用戶地址空間的進程,這些程序如果不是處於idle狀態,那么絕大多數的CPU時間都是運行在用戶態。
- 1.0% sy 內核空間占用CPU百分比
- 解釋:進程在內核地址空間中消耗CPU時間的百分比。所有進程要使用的系統資源都是由Linux內核處理的。當處於用戶態(用戶地址空間)的進程需要使用系統的資源時,比如需要分配一些內存、或是執行IO操作、再或者是去創建一個子進程,此時就會進入內核態(內核地址空間)運行。事實上,決定進程在下一時刻是否會被運行的進程調度程序就運行在內核態。對於操作系統的設計來說,消耗在內核態的時間應該是越少越好,在實踐中有一類典型的情況會使sy變大,那就是大量的IO操作,因此在調查IO相關的問題時需要着重關注它。
- 解釋:進程在內核地址空間中消耗CPU時間的百分比。所有進程要使用的系統資源都是由Linux內核處理的。當處於用戶態(用戶地址空間)的進程需要使用系統的資源時,比如需要分配一些內存、或是執行IO操作、再或者是去創建一個子進程,此時就會進入內核態(內核地址空間)運行。事實上,決定進程在下一時刻是否會被運行的進程調度程序就運行在內核態。對於操作系統的設計來說,消耗在內核態的時間應該是越少越好,在實踐中有一類典型的情況會使sy變大,那就是大量的IO操作,因此在調查IO相關的問題時需要着重關注它。
- 0.0% ni 用戶進程空間內改變過優先級的進程占用CPU百分比
- 解釋:ni是nice的縮寫,可以通過nice值調整進程用戶態的優先級,這里顯示的ni表示調整過nice值的進程消耗掉的CPU時間。如果系統中沒有進程被調整過nice值,那么ni就顯示為0
- 98.7% id 空閑CPU百分比
- 0.0% wa 等待輸入輸出的CPU時間百分比
- 解釋:CPU等待磁盤IO操作的時間。和CPU的處理速度相比,磁盤IO操作是非常慢的,有很多這樣的操作,比如:CPU在啟動一個磁盤讀寫操作后,需要等待磁盤讀寫操作的結果。在磁盤讀寫操作完成前,CPU只能處於空閑狀態。Linux系統在計算系統平均負載時會把CPU等待IO操作的時間也計算進去,所以在我們看到系統平均負載過高時,可以通過wa來判斷系統的性能瓶頸是不是過多的IO操作造成的。
- 0.1% hi 硬中斷占用百分比
- 0.0% si 軟中斷占用百分比
- 解釋:這兩個值表示系統處理中斷消耗的時間。中斷分為硬中斷和軟中斷,hi表示處理硬中斷消耗的時間,si表示處理軟中斷消耗的時間。硬中斷是硬盤、網卡等硬件設備發送給CPU的中斷消息,當CPU收到中斷消息后需要進行適當的處理(消耗CPU時間)。軟中斷是由程序發出的中斷,最終也會執行相應的處理程序(消耗CPU時間)
最后兩行為內存信息。內容如下:
- Mem: 2070564k total 物理內存總量
- 1340828k used 使用的物理內存總量
- 729736k free 空閑的內存總量
- 168636k buffers 用作內核緩存的內存量
- Swap: 4192924k total 交換區內存總量
- 0k used 使用的交換區總量
- 4192924k free 空閑的交換區總量
- 894080k cached 緩沖的交換區總量
2.2、進程的統計信息
序號 列名 含義 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
默認情況下僅顯示比較重要的 PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND 列。可以通過下面的快捷鍵來更改顯示內容。
2.3、更改顯示內容
通過按f鍵可以編輯顯示內容,按f鍵后,會出現下圖:

根據圖中描述可知:
①當前是按照%CPU這一列來排序的
②可以通過上、下鍵來導航
③按右鍵可以選擇整個列,然后按上、下鍵來移動整個列(調整列的顯示位置,前移或后移),按回車確定
④按空格鍵來顯示/隱藏該列,帶*的是顯示,不帶*的是不顯示
⑤按s鍵可以將當前列設置為排序列
⑥按q鍵退出
三、top命令的使用方式
top命令的格式為:
top [選項]
top命令常用的選項參數有:
| 選項 | 功能 |
| -d | 指定每兩次屏幕信息刷新之間的時間間隔,如希望每秒刷新一次,則使用:top -d 1 |
| -p | 通過指定PID來僅僅監控某個進程的狀態 |
| -S | 指定累計模式 |
| -s | 使top命令在安全模式中運行。這將去除交互命令所帶來的潛在危險 |
| -i | 使top不顯示任何閑置或者僵死的進程 |
| -c | 顯示整個命令行而不只是顯示命令名 |
3.1、top命令使用舉例
top //每隔3秒顯式所有進程的資源占用情況 top -d 1 //每隔1秒顯式所有進程的資源占用情況 top -c //每隔3秒顯式進程的資源占用情況,並顯示進程的命令行參數(默認只有進程名) top -p 12345 -p 6789//每隔3秒顯示pid是12345和pid是6789的兩個進程的資源占用情況 top -d 2 -c -p 123456 //每隔2秒顯示pid是123456的進程的資源使用情況,並顯式該進程啟動的命令行參數
3.2、top的交互命令
【1】過濾用戶:在top命令顯示中,輸入u,然后輸入用戶名,則可以查看相應的用戶進程。如按u鍵,然后輸入tiger,按回車則只顯示tiger的進程:

【2】查看各個CPU的使用情況:在top命令下,輸入1,可以看到各個CPU的使用情況:

【3】隱藏閑置或僵死的進程:在top命令下,輸入i,可以隱藏閑置或僵死的進程,效果跟輸入top -i是一樣的。
【4】切換內存信息的單位:top命令默認以K為單位顯示內存大小,這讓人十分抓狂,我們可以通過大寫字母E來切換內存信息區域的顯示單位。小寫字母m可以控制是否顯示內存信息。

【5】切換進程列表中的內存顯示單位:在進程列表中,內存的單位默認也是KB,我們可以通過小寫字母e來切換單位。

【6】粗體顯示排序的列:由前文可知,f鍵可以改變排序的列,但界面中看不出是以哪個列來排序的,可以通過小寫字母x來粗體顯示當前排序的列:

【7】快速切換排序的列:雖然可以通過f鍵來修改排序的列,但還有一些快速切換排序列的方式:比如大寫字母M以%MEM列排序,大寫字母N以PID列排序,大寫字母P以%CPU列排序,大寫字母T以TIME+列排序。大寫字母R可以將當前的排序結果反轉。
【8】顯示完整的執行命令:默認COMMAND列只顯示程序的名字,並不包含程序的路徑,可以通過小寫字母c來顯示完整的執行命令(效果跟top -c相同):
【9】顯示幫助文檔: 輸入h進入top命令的幫助文檔。
