Linux命令之top命令介紹 top命令是Linux下常用的性能分析工具,能夠實時顯示系統中各個進程的資源占用狀況,類似於Windows的任務管理器。下麵詳細介紹它的使用方法。 top是一個動態顯示過程,即可以通過用戶按鍵來不斷刷新當前狀態.如果在前臺執行該命令,它將獨占前臺,直到用戶終止該程式為 ...
Linux命令之top命令介紹
top命令是Linux下常用的性能分析工具,能夠實時顯示系統中各個進程的資源占用狀況,類似於Windows的任務管理器。下麵詳細介紹它的使用方法。
top是一個動態顯示過程,即可以通過用戶按鍵來不斷刷新當前狀態.如果在前臺執行該命令,它將獨占前臺,直到用戶終止該程式為止.比較準確的說,top命令提供了實時的對系統處理器的狀態監視.它將顯示系統中CPU最“敏感”的任務列表.該命令可以按CPU使用.記憶體使用和執行時間對任務進行排序;而且該命令的很多特性都可以通過互動式命令或者在個人定製文件中進行設定
1.命令格式:
top [參數]
2.命令功能:
顯示當前系統正在執行的進程的相關信息,包括進程ID、記憶體占用率、CPU占用率等
3.命令參數:
-b 批處理
-c 顯示完整的觸發命令(即commont欄位內容的切換,貌似顯示為請求類型與完整的該進程的觸發命令行內容之間切換) 顯示整個命令行而不只是顯示命令名,這裡指的是command欄位的列信息,將顯示完整的開啟該進程的命令行的信息。 開啟前:mysqld,開啟後:/usr/libexec/mysqld --basedir=/usr --datadir=/newdata/mysqldata --user=mysql --log
-I 忽略失效過程
-s 保密模式。
-S 累積模式。
-i<時間> 設置間隔時間。
-u<用戶名> 指定用戶名。
-p<進程號> 指定進程。
-n<次數> 迴圈顯示的次數。
4.使用實例:
實例1:顯示進程信息
[root@TG1704 log]# top
top - 14:06:23 up 70 days, 16:44, 2 users, load average: 1.25, 1.32, 1.35
Tasks: 206 total, 1 running, 205 sleeping, 0 stopped, 0 zombie
Cpu(s): 5.9%us, 3.4%sy, 0.0%ni, 90.4%id, 0.0%wa, 0.0%hi, 0.2%si, 0.0%st
Mem: 32949016k total, 14411180k used, 18537836k free, 169884k buffers
Swap: 32764556k total, 0k used, 32764556k free, 3612636k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
28894 root 22 0 1501m 405m 10m S 52.2 1.3 2534:16 java
18249 root 18 0 3201m 1.9g 11m S 35.9 6.0 569:39.41 java
2808 root 25 0 3333m 1.0g 11m S 24.3 3.1 526:51.85 java
25668 root 23 0 3180m 704m 11m S 14.0 2.2 360:44.53 java
574 root 25 0 3168m 611m 10m S 12.6 1.9 556:59.63 java
1599 root 20 0 3237m 1.9g 11m S 12.3 6.2 262:01.14 java
1008 root 21 0 3147m 842m 10m S 0.3 2.6 4:31.08 java
13823 root 23 0 3031m 2.1g 10m S 0.3 6.8 176:57.34 java
28218 root 15 0 12760 1168 808 R 0.3 0.0 0:01.43 top
29062 root 20 0 1241m 227m 10m S 0.3 0.7 2:07.32 java
1 root 15 0 10368 684 572 S 0.0 0.0 1:30.85 init
2 root RT -5 0 0 0 S 0.0 0.0 0:01.01 migration/0
3 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/0
4 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/0
5 root RT -5 0 0 0 S 0.0 0.0 0:00.80 migration/1
6 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/1
7 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/1
8 root RT -5 0 0 0 S 0.0 0.0 0:20.59 migration/2
9 root 34 19 0 0 0 S 0.0 0.0 0:00.09 ksoftirqd/2
10 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/2
11 root RT -5 0 0 0 S 0.0 0.0 0:23.66 migration/3
12 root 34 19 0 0 0 S 0.0 0.0 0:00.03 ksoftirqd/3
13 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/3
14 root RT -5 0 0 0 S 0.0 0.0 0:20.29 migration/4
15 root 34 19 0 0 0 S 0.0 0.0 0:00.07 ksoftirqd/4
16 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/4
17 root RT -5 0 0 0 S 0.0 0.0 0:23.07 migration/5
18 root 34 19 0 0 0 S 0.0 0.0 0:00.07 ksoftirqd/5
19 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/5
20 root RT -5 0 0 0 S 0.0 0.0 0:17.16 migration/6
21 root 34 19 0 0 0 S 0.0 0.0 0:00.05 ksoftirqd/6
22 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/6
23 root RT -5 0 0 0 S 0.0 0.0 0:58.28 migration/7
統計信息區:前五行是當前系統情況整體的統計信息區。下麵我們看每一行信息的具體意義。
第一行,任務隊列信息,該行同linux命令行uptime 命令的執行結果,詳細參見本手冊的uptime命令,具體參數說明情況如下:
14:06:23 — 當前系統時間
up 70 days, 16:44 — 系統已經運行了70天16小時44分鐘(在這期間系統沒有重啟過的吆!)
2 users — 當前有2個用戶登錄系統
load average: 1.15, 1.42, 1.44 — load average後面的三個數分別在剛剛過去的1分鐘、5分鐘、15分鐘的負載情況,詳細參見uptime命令。
load average數據是每隔5秒鐘檢查一次活躍的進程數,然後按特定演算法計算出的數值。如果這個數除以邏輯CPU的數量,結果高於5的時候就表明系統在超負荷運轉了。
第二行,Tasks — 任務(進程),具體信息說明如下:
206 total, 系統現在共有206個進程
1 running, 其中處於運行中的有1個
205 sleeping, 205個在休眠(sleep)
0 stopped, stoped狀態的有0個
0 zombie zombie狀態(僵屍)的有0個
第三行,cpu狀態信息,具體屬性說明如下(關於cpu的使用率的計算,指的是一段時間內統計的處於在用狀態的cpu時間片占該統計時間段的比例。比如linux的top命令貌似預設3秒統計一次。詳細參考子節點cpu使用率):
5.9%us — 記憶體的用戶空間部分程式占用CPU的百分比
3.4% sy — 記憶體的內核空間部分程式占用CPU的百分比。
0.0% ni — 改變過優先順序的進程占用CPU的百分比
90.4% id — 空閑CPU百分比
0.0% wa — IO等待占用CPU的百分比等待輸入輸出的CPU時間百分比
0.0% hi — 硬中斷(Hardware IRQ)占用CPU的百分比,CPU服務於硬體中斷所耗費的時間總額
0.2% si — 軟中斷(Software Interrupts)占用CPU的百分比,CPU服務軟中斷所耗費的時間總額
0.0%st 虛擬機占用百分比
備註:在這裡CPU的使用比率和windows概念不同,需要理解linux系統記憶體區劃的用戶空間和內核空間的相關知識,參見本節點的子節點介紹!
第四行,記憶體狀態,具體信息如下:
32949016k total — 物理記憶體總量(32GB)
14411180k used — 使用中的記憶體總量(14GB)【使用中的記憶體總量(used)指的是現在系統內核控制的記憶體數,這裡可以理解為特指分配給應用進程的記憶體+物理記憶體的buffers+物理記憶體的caches這3個的和,應用進程有最高優先順序,當物理記憶體不足時,系統會將buffers緩存的數據寫入到磁碟,將caches緩存的數據寫入到交換區的chaches,從而為程式運行提供更多記憶體使用。也就是說,判斷記憶體是否夠用,主要的指標是判斷訪問高峰期,是否可以給應用程式運行提供足夠的記憶體-亞強】
18537836k free — 空閑記憶體總量(18GB)【空閑記憶體總量(free)是內核還未納入其管控範圍的數量。納入內核管理的記憶體不見得都在使用中,還包括過去使用過的現在可以被重覆利用的記憶體,內核並不把這些可被重新使用的記憶體交還到free中去,因此在linux上free記憶體會越來越少,但不用為此擔心。】
169884k buffers — 緩存的記憶體量 (169M),用於暫時存放要寫入到磁碟的數據,等待系統資源充足時候一次性寫入磁碟速度更快。從而不必每次程式寫入動作無需等待真正寫入磁碟成功,將要寫入的數據先存放到記憶體buffers緩衝區,程式直接繼續執行下麵的動作。
備註:關於真正的機器的可用記憶體,如果出於習慣去計算真正的可用記憶體數,這裡有個近似的計算公式:第四行的free + 第四行的buffers + 第五行的cached(這個參數本身代表swap交換區的一段存儲空間,只是該存儲空間的大小也等於物理記憶體中系統開闢的cached存儲區間,也就是交換區與物理記憶體都有cached緩衝區-亞強),按這個公式此台伺服器的可用記憶體:18537836k +169884k +3612636k = 22GB左右。
對於記憶體監控,在top里我們要時刻監控第五行swap交換分區的used,如果這個數值在不斷的變化,說明內核在不斷進行記憶體和swap的數據交換,這是真正的記憶體不夠用了。
第五行,swap交換分區信息(也叫做虛擬物理記憶體,即在硬碟上開闢的一段空間,用於類似於記憶體功能,但是存取速度遠低於記憶體,可以用於記憶體不足時使用),具體信息說明如下:
32764556k total — 交換區總量(32GB)
0k used — 使用的交換區總量(0K)
32764556k free — 空閑交換區總量(32GB)
3612636k cached — 緩衝的交換區總量(3.6GB),物理記憶體中的內容被換出到swap交換區,而後又被換入到物理記憶體,但使用過的swap交換區尚未被覆蓋(註意這些尚未被覆蓋的存儲空間不計入第五行的used參數值,貌似被計入了第五行的free中,因為這段記憶體空間如果系統需要,就會被覆蓋掉,因此被計入到了free變數),該數值即為這些內容已存在於物理記憶體中的交換區的大小,相應的記憶體,再次被換出時可不必再對swap交換區寫入。也就是該參數值得記憶體中的一段存儲空間,這段空間中存儲著在交換區的一段空間數據,但是註意該交換區的數據實際已經被註銷掉,成為空閑空間free,你知道即使成為空閑空間,那麼如果沒有新數據寫入覆蓋掉該段存儲空間,那麼這段空間的數據是不會丟失的,因此當與之對應的記憶體中的當時調入記憶體中的同樣的數據由於系統調用再次被調出到swap交換區(這段數據已經存在於交換區),那麼系統不會重新將這段數據寫入交換區,而是將原來已經存在於交換區的數據標誌為可用即可。
綜上:【亞強】緩衝交換區cached是swap交換區中的一段空間,該空間存儲著從物理記憶體調入到swap交換區且又被物理記憶體調回到物理記憶體的數據且尚未被從物理記憶體新調入到swap交換區的數據覆蓋掉的在swap交換區所占存儲空間。當系統需要再次調出物理記憶體中的這些已經存在於cached中的數據到swap交換區,那麼系統不會重新寫入數據到swap交換區,而是將原來的這些存在於cached中的註銷標記改為數據可用即可(從而加快了數據交互速度)。這些用於cached緩衝交換區的存儲空間,當從物理記憶體中調入交換區swap的數據量很大時,那麼新調入的數據就可能要覆蓋掉這些cached所占空間的有註銷標記的數據。因此cached緩衝交換區單獨拿出來,不被計入到used參數下,而是計入到free參數下,因為cached仍然是可以被使用的。
亞強(強商科技)註釋:關於linux記憶體管理機制(物理記憶體(分為程式使用的記憶體和buffers,cached)和虛擬記憶體(swap交換分區)),詳細參見本階段下麵的【linux記憶體管理機制】節點。
第六行,空行
第七行以下:各進程(任務)的狀態監控,項目列信息說明如下:
預設情況下僅顯示比較重要的 PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND 列。可以通過下麵的快捷鍵來更改顯示內容。
序號 列名 含義
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時間占用百分比,The task's share(分配) of the elapsed(消逝的) CPU time since the last screen
update, expressed as a percentage of total CPU time. In a true SMP environment, if 'Irix mode' is Off, top will operate in
'Solaris mode' where a task's cpu usage will be divided by the total number of CPUs.You toggle 'Irix/Solaris' modes with
the 'I' interactive command.可以用I來切換Irix/Solaris模式,在多核心的cpu系統中,%cpu列將根據上一次更新時刻到本次更新時刻每個cpu的總時間
分為100份,即如果有n個cpu核心,那麼總時間份數為n*100份。那麼每個進程的份數累加最大可以達到n*100.如果運行在Irix模式下,那麼每個進程
的%cpu欄位的值為上一次更新時刻到本次更新時刻所有cpu核心處理器分配給該進程的份數總和與n*100的比例,即此種情況是相對於全部cpu的時間份數總
額的占比。如果運行在Solaris模式下,那麼每個進程的的%cpu欄位的值為上一次更新時刻到本次更新時刻所有cpu核心處理器分配給該進程的份數總和與100
的比例,即此種情況是相對於每個cpu時間份數總額的占比(這裡的cpu應該指的是邏輯cup格式,1個物理cpu可以有多個核心,著多個核心
也可以稱為多個邏輯cpu)
l TIME 進程使用的CPU時間總計,單位秒,top命令的TIME/TIME+是指的進程所使用的CPU時間,不是進程啟動到現在的時間,因此,如果一個進程使
用的cpu很少,那即使這個進程已經存在N長時間,TIME/TIME+也是很小的數值。此外,如果你的系統有多個CPU,或者是多核CPU的話,那麼,進程占用多
個cpu的時間是累加的。 Total CPU time the task has used since it started. When ‘Cumulative mode’ is On, each process is listed with
the cpu time that it and its dead children has used. You toggle ‘Cumulative mode’ with ‘S’, which is a command-line option and an
interactive command. See the ‘S’ interactive command for additional information regarding this mode.
m TIME+ 進程使用的CPU時間總計,單位1/100秒,top命令的TIME/TIME+是指的進程所使用的CPU時間,不是進程啟動到現在的時間,因此,如果
一個進程使用的cpu很少,那即使這個進程已經存在N長時間,TIME/TIME+也是很小的數值。此外,如果你的系統有多個CPU,或者是多核CPU的話,那麼,
進程占用多個cpu的時間是累加的。CPU Time, hundredths The same as ‘TIME’, but reflecting more granularity through hundredths of
a second
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=僵屍進程,詳細參見子節點【Linux進程狀態解析 之 R、S、D、T、Z、X (主要有三個狀態)】)
x COMMAND 觸發當前進程的命令名/命令行(可以用c來切換)
y WCHAN 若該進程在睡眠,則顯示睡眠中的系統函數名
z Flags 任務標誌,參考 sched.h
其他使用技巧:
多U多核CPU監控
在top基本視圖中,按鍵盤數字“1”,可監控每個邏輯CPU的狀況,下麵的cpu0,cpu1,cpu2,cpu3.....cpu15共計16個邏輯cpu:再按一下數字1,則返回主頁面,顯示cpu(s)的cpu性能。
觀察上圖,伺服器有16個邏輯CPU,實際上是4個物理CPU。再按數字鍵1,就會返回到top基本視圖界面。
高亮顯示當前運行進程
敲擊鍵盤“b”(打開/關閉加亮效果),top的視圖變化如下:()
我們發現進程id為2570的“top”進程被加亮了,top進程就是視圖第二行顯示的唯一的運行態(runing)的那個進程,可以通過敲擊“y”鍵關閉或打開運行態進程的加亮效果。
進程欄位排序欄位高亮顯示
top -x
註意:使用-x開啟排序高亮功能後,還需要使用-b命令給出是否高亮顯示該排序的列。
預設進入top時,各進程是按照CPU的占用量來排序的,在下圖中進程ID為28894的java進程排在第一(cpu占用142%),進程ID為574的java進程排在第二(cpu占用16%)。
敲擊鍵盤“x”(打開/關閉排序列的加亮效果,如會將當前排序行,高亮顯示),top的視圖變化如下:
可以看到,top預設的排序列是“%CPU”。
排序欄位: 通過”shift + >”或”shift + <”可以向右或左改變排序列(註意:該組合鍵是在開啟了top之後,運行時按下的)
下圖是按一次”shift + >”的效果圖,視圖現在已經按照%MEM來排序。
實例2:顯示完整命令
命令:
top -c //亞強:該行貌似與直接寫top效果一樣
輸出:
說明:
實例3:以批處理模式顯示程式信息(高亮顯示某些欄位,與-x結合,可以控制顯示當前排序欄位高亮)
命令:
top -b
輸出:
說明:
實例4:以累積模式顯示程式信息
命令:
top -S
輸出:
說明:
實例5:設置信息更新次數
命令:
top -n 2
輸出:
說明:
表示更新兩次後終止更新顯示
實例6:設置信息更新時間,即間隔多少秒後更新,該參數支持浮點型數據,如top -d 0.2,每隔0.2秒刷新一次數據。
命令:
top -d 3
輸出:
說明:
表示更新周期為3秒
實例7:顯示指定的進程信息
命令:
top -p 574 //亞強:後面的數字是PID的值,即進程的id號
輸出:
說明:
實例8:top交互命令(關於下麵需要輸入參數的命令如何返回到交互狀態初始化狀態,可以不輸入任何參數,然後按下enter即可,如果輸入參數,然後按下enter,那麼執行當前交互命令,對於其他交互動作,可以用enter確認執行,用esc取消執行)
在top 命令執行過程中可以使用的一些交互命令。這些命令都是單字母的,如果在命令行中使用了s 選項, 其中一些命令可能會被屏蔽。
h 顯示幫助畫面,給出一些簡短的命令總結說明,按任意鍵後返回到top列表界面。
k 終止一個進程。輸入pid參數+enter即可以殺死該pid對應的進程。我們可以直接按下enter返回到top界面。
i 忽略閑置和僵死進程。這是一個開關式命令。
q 退出程式,//退出top命令
r 重新安排一個進程的優先順序別
S 切換到累計模式
s 改變兩次刷新之間的延遲時間(單位為s),如果有小數,就換算成ms(比如0.1的效果是100ms)。輸入0值則系統將不斷刷新,預設值是3s(centos中)
f從當前顯示中添加或者刪除項目更改顯示內容通過 f 鍵可以選擇顯示的內容。按 f 鍵之後會顯示列的列表,按 a-z 即可顯示或隱藏對應的列,最後按回車鍵確定。
F或O:選擇當前排序欄位,按下a-z中的某個按鍵確定排序欄位,然後按下enter確認,按下esc取消。
o或者O 改變顯示項目的順序//進入該模式後,系統用a,b,c,d,e...n標記代表每一列的表頭,我們通過按下【標記字母】,那麼該欄位後移動,按下【shift+標記字母】,則前移動。按 o 鍵可以改變列的顯示順序。按小寫的 a-z 可以將相應的列向右移動,而大寫的 A-Z 可以將相應的列向左移動。最後按回車鍵確定,按下esc取消。
l 字母l,切換顯示平均負載和啟動時間信息//top的第一行是否顯示
1 數字1,在top基本視圖中,按鍵盤數字“1”,可監控每個邏輯CPU的狀況,下麵的cpu0,cpu1,cpu2,cpu3.....cpu15共計16個邏輯cpu:再按一下數字1,則返回主頁面,顯示cpu(s)的cpu性能。
m 切換顯示記憶體信息//top的第4,5行是否顯示
t 切換顯示進程和CPU狀態信息//top的第2,3行是否顯示
c 切換顯示命令名稱和完整命令行(亞強:(即commont欄位內容的切換,貌似顯示為請求類型與完整的該進程的觸發命令行內容之間切換))顯示整個命令行而不只是顯示命令名 ,這裡指的是command欄位的列信息,將顯示完整的開啟該進程的命令行的信息/僅僅簡略顯示來切換顯示。
M 根據駐留記憶體大小進行排序
P 根據CPU使用百分比大小進行排序
T 根據時間/累計時間進行排序
R 改變排序方式(升序/降序)
”shift + >”或”shift + <”:可以向右或左改變排序列(註意:該組合鍵是在開啟了top之後,運行時按下的)
b 當前處於運行狀態的行高亮/取消高亮(控制當前排序的行是否高亮,需要首先使用x開啟排序高亮)
x 當前處於排序欄位的列高亮/取消高亮(有時候直接按下x無效果,此時首先按一下b執行高亮顯示)
I:切換Irix/Solaris模式,在多核心的cpu系統中,%cpu列將根據上一次更新時刻到本次更新時刻每個cpu的總時間分為100份,即如果有
n個cpu核心,那麼總時間份數為n*100份。那麼每個進程的份數累加最大可以達到n*100.如果運行在Irix模式下,那麼每個進程的的%cpu欄位的值為上一次更新時刻到本次更新時刻所有cpu核心處理器分配給該進程的份數總和與n*100的比例,即此種情況是相對於全部cpu的時間份數總額的占比。如果運行在Solaris模式下,那麼每個進程的的%cpu欄位的值為上一次更新時刻到本次更新時刻所有cpu核心處理器分配給該進程的份數總和與100的比例,即此種情況是相對於每個cpu時間份數總額的占比。
W 將當前設置寫入~/.toprc文件中
附常用操作:
top //每隔5秒顯式所有進程的資源占用情況
top -d 2 //每隔2秒顯式所有進程的資源占用情況
top -p 12345 -p 6789//每隔5秒顯示pid是12345和pid是6789的兩個進程的資源占用情況
top -d 2 -c -p 123456 //每隔2秒顯示pid是12345的進程的資源使用情況,並顯式該進程啟動的命令行參數