Linux中top命令參數詳解、常用快捷鍵

1、命令

1.簡介

top命令是Linux下常用的性能分析工具,能夠實時顯示系統中各個進程的資源佔用狀況,類似於Windows的任務管理器。 
顯示系統當前的進程和其他狀況; top是一個動態顯示過程,即可以通過用戶按鍵來不斷刷新當前狀態.如果在前臺執行該命令,它將獨佔前臺,直到用戶終止該程序爲止. 比較準確的說,top命令提供了實時的對系統處理器的狀態監視.它將顯示系統中CPU最“敏感”的任務列表.該命令可以按CPU使用.內存使用和執行時間對任務進行排序;而且該命令的很多特性都可以通過交互式命令或者在個人定製文件中進行設定。下面詳細介紹它的使用方法。

2.使用方法

2.1 使用格式

top [-] [d] [p] [q] [c] [C] [S] [s] [n]

2.2 參數說明

  • d 指定每兩次屏幕信息刷新之間的時間間隔。當然用戶可以使用s交互命令來改變之。
  • p 通過指定監控進程ID來僅僅監控某個進程的狀態。
  • q 該選項將使top沒有任何延遲的進行刷新。如果調用程序有超級用戶權限,那麼top將以儘可能高的優先級運行。
  • S 指定累計模式
  • s 使top命令在安全模式中運行。這將去除交互命令所帶來的潛在危險。
  • i 使top不顯示任何閒置或者僵死進程。
  • c 顯示整個命令行而不只是顯示命令名

2.3 其他

  下面介紹在top命令執行過程中可以使用的一些交互命令。從使用角度來看,熟練的掌握這些命令比掌握選項還重要一些。這些命令都是單字母的,如果在命令行選項中使用了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配置文件的推薦方法。

3.實例解析

 

Linuxä¸topå½ä»¤ä½¿ç¨è¯¦è§£

前五行是系統整體的統計信息。

3.1 第一行是任務隊列信息,同 uptime 命令的執行結果。其內容如下:

  • 10:45:47 當前時間
  • up 61 days 系統運行時間
  • 1 user 當前登錄用戶數
  • load average: 6.28, 6.99, 7.18 系統負載,任務隊列的平均長度,即CPU的平均負載情況,三個數值分別爲 1分鐘、5分鐘、15分鐘前到現在的平均值。 
    我們任取一列,如第一列,即表示在剛剛過去的1分鐘內: 
    如果是單核CPU的話,1.00就表示CPU已經滿負荷了, 
    如果是多核CPU的話,load average達到CPU的核數即說明該CPU已經滿負荷了, 
    如果是多顆物理CPU,則當load average達到所有物理CPU的總核數時,說明系統CPU滿負荷了。 
    簡而言之,CPU的核數即爲我們根據load average衡量CPU負載的依據。 
    剛剛我們看的是最近1分鐘的負載,load average還顯示了最近5分鐘和15分鐘的負載,那麼一般情況下我們應該看哪個呢? 
    其實,1分鐘,5分鐘,15分鐘體現的是剛剛過去15分鐘系統負載的一種趨勢, 
    如果1分鐘負載高於5分鐘和15分鐘的負載,說明負載是最近1分鐘發生的,尚未反映到5分鐘和15分鐘的負載上, 
    如果在隨後的15分鐘內系統一直維持最近1分鐘的負載,那麼5分鐘和15分鐘的負載也將逐近提高到1分鐘的水平; 
    如果隨後的負載沒有繼續維持最近1分鐘的負載,而是降低到原來水平,那麼5分鐘和15分鐘的負載會有微小波動然後維持現有水平。 
    如果1分鐘負載低,而5分鐘和15分鐘的負載高,說明最近15分鐘內系統負載高,但是CPU的使用情況在最近的1分鐘降了下來。 
    由此看來,1分鐘的數據更能反映CPU負載的實時情況,而15分鐘的數據則說明系統穩定在某一情況,更有指示價值。 
    那麼當CPU負載達到哪個值時,就該引起我們注意了呢?按照參考文章給的經驗值是CPU核數乘以0.7, 
    即如果CPU總核數爲4,當load average上15分鐘的數值達到2.8時,我們就該好好進系統看看了。

3.2 第二、三行爲進程和CPU的信息。當有多個CPU時,這些內容可能會超過兩行。內容如下:

Tasks:

  • 310 total 進程總數
  • 1 running 正在運行的進程數
  • 309 sleeping 睡眠的進程數
  • 0 stopped 停止的進程數
  • 0 zombie 殭屍進程數

Cpu(s):

  • 3.3 us 用戶空間佔用CPU百分比
  • 3.6 sy 內核空間佔用CPU百分比
  • 0.2 ni 用戶進程空間內改變過優先級的進程佔用CPU百分比
  • 27.1 id 空閒CPU百分比
  • 65.6 wa 等待輸入輸出的CPU時間百分比
  • 0.0 hi hardware irq
  • 0.2 si software irq
  • 0.0 st steal time

3.3 最後兩行爲內存信息。內容如下:

Mem:

  • 12304244 total 物理內存總量
  • 146240 free 空閒內存總量
  • 8502892 used 使用的物理內存總量
  • 3655112 buff/cache 用作內核緩存的內存量 
    buffer是即將要被寫入磁盤的,cache是被從磁盤中讀出來的。這二者是爲了提高IO性能的,並由OS管理,並非應用自己分配的內存,而是OS自己根據需要對空閒內存進行的額外利用。因爲這部分只是緩存,降低IO,提升性能,只要應用程序有需要,OS可以直接將buffer寫入磁盤,將cache刪掉來得到空閒內存給應用程序使用。 
    buffer是用於存儲速度不同步的設備或優先級不同的設備之間傳輸數據的區域。緩衝(buffers)是根據磁盤的讀寫設計的,把分散的寫操作集中進行,減少磁盤碎片和硬盤的反覆尋道,從而提高系統性能。 
    cache經常被用在磁盤的I/O請求上,如果有多個進程都要訪問某個文件,於是該文件便被做成cache以方便下次被訪問,這樣可提供系統性能。緩存(cached)是把讀取過的數據保存起來,重新讀取時若命中(找到需要的數據)就不要去讀硬盤了,若沒有命中就讀硬盤。其中的數據會根據讀取頻率進行組織,把最頻繁讀取的內容放在最容易找到的位置,把不再讀的內容不斷往後排,直至從中刪除。 
    使用內存是實際當前使用內存減去buffers/cache之和;空閒內存是實際空閒內存加上buffers/cache之和

Swap:

  • 4063228 total 交換區總量
  • 2991268 free 空閒交換區總量
  • 1071960 used 使用的交換區總量
  • 2905240 avail Mem 表示可用於進程下一次分配的物理內存數量,這個大小一般比free大一點,因爲除了free的空間外,系統還能立即釋放出一些空間來。

備註: 
我們在觀察Linux的內存使用情況時,只要沒發現用swap的交換空間,就不必擔心自己的內存太少。 
如果常常看到swap用了很多,那麼你就要考慮加物理內存了。這也是在Linux服務器上看內存是否夠用的標準。

3.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
默認情況下僅顯示比較重要的 PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND 列。可以通過下面的快捷鍵來更改顯示內容。

更改顯示內容

  • 通過 f 鍵可以選擇顯示的內容。按 f 鍵之後會顯示列的列表,按 a-z 即可顯示或隱藏對應的列,最後按回車鍵確定。
  • 按 o 鍵可以改變列的顯示順序。按小寫的 a-z 可以將相應的列向右移動,而大寫的 A-Z 可以將相應的列向左移動。最後按回車鍵確定。
  • 按大寫的 F 或 O 鍵,然後按 a-z 可以將進程按照相應的列進行排序。而大寫的 R 鍵可以將當前的排序倒轉。

字段c詳解

 

常用命令及快捷鍵:

top命令的輸出如下

image

  • 第一行:系統運行時間和平均負載

當前時間、系統已運行時間、當前登錄用戶的數量、最近5、10、15分鐘內的平均負載

  • 第二行:任務

任務的總數、運行中(running)的任務、休眠(sleeping)中的任務、停止(stopped)的任務、殭屍狀態(zombie)的任務

  • 第三行:cpu狀態
字段 字段釋義
us user: 運行(未調整優先級的) 用戶進程的CPU時間
sy system: 運行內核進程的CPU時間
ni niced:運行已調整優先級的用戶進程的CPU時間
id idle:空閒時間
wa IO wait: 用於等待IO完成的CPU時間
hi 處理硬件中斷的CPU時間
si 處理軟件中斷的CPU時間
st 這個虛擬機被hypervisor偷去的CPU時間(譯註:如果當前處於一個hypervisor下的vm,實際上hypervisor也是要消耗一部分CPU處理時間的)

 

  • 第四行:內存

全部可用內存、已使用內存、空閒內存、緩衝內存

  • 第五行:swap

全部、已使用、空閒和緩衝交換空間

  • 第七行至N行:各進程任務的的狀態監控
字段 釋義
PID 進程ID,進程的唯一標識符
USER 進程所有者的實際用戶名
PR 進程的調度優先級。這個字段的一些值是'rt'。這意味這這些進程運行在實時態。
NI 進程的nice值(優先級)。越小的值意味着越高的優先級。負值表示高優先級,正值表示低優先級
VIRT

virtual memory usage 虛擬內存,進程使用的虛擬內存。進程使用的虛擬內存總量,單位kb。VIRT=SWAP+RES

1、進程“需要的”虛擬內存大小,包括進程使用的庫、代碼、數據等
2、假如進程申請100m的內存,但實際只使用了10m,那麼它會增長100m,而不是實際的使用量

RES

resident memory usage 常駐內存,駐留內存大小。駐留內存是任務使用的非交換物理內存大小。進程使用的、未被換出的物理內存大小,單位kb。RES=CODE+DATA

1、進程當前使用的內存大小,但不包括swap out
2、包含其他進程的共享
3、如果申請100m的內存,實際使用10m,它只增長10m,與VIRT相反
4、關於庫佔用內存的情況,它只統計加載的庫文件所佔內存大小

SHR

SHR:shared memory 共享內存

1、除了自身進程的共享內存,也包括其他進程的共享內存
2、雖然進程只使用了幾個共享庫的函數,但它包含了整個共享庫的大小
3、計算某個進程所佔的物理內存大小公式:RES – SHR
4、swap out後,它將會降下來

S

這個是進程的狀態。它有以下不同的值:

  • D - 不可中斷的睡眠態。
  • R – 運行態
  • S – 睡眠態
  • T – 被跟蹤或已停止
  • Z – 殭屍態
%CPU 自從上一次更新時到現在任務所使用的CPU時間百分比。%CPU顯示的是進程佔用一個核的百分比,而不是整個cpu(N核)的百分比,有時候可能大於100,那是因爲該進程啓用了多線程佔用了多個核心,所以有時候我們看該值得時候會超過100%,但不會超過總核數*100
%MEM 進程使用的可用物理內存百分比
TIME+ 任務啓動後到現在所使用的全部CPU時間,精確到百分之一秒
COMMAND 運行進程所使用的命令。進程名稱(命令名/命令行)
2、交互命令

按“h”或者“?”,會顯示幫助

 

Z:改變顏色;B:加粗

t:顯示和隱藏任務/cpu信息;m:內存信息

1:監控每個邏輯CPU的狀況;

f:進入字段顯示配置模式,可增加或者移除顯示字段,按相應的字母新增或去除;o:進入字段順序設置模式,可配置顯示位置順序,按相應的字母往下移動,按“shift+相應的字母”往上移動         ---------常用

F:進入字段排序配置模式,可設置排序的字段;

R:正常排序/反向排序;

s:設置刷新的時間--------常用

u:輸入用戶,顯示用戶的任務

i:忽略閒置和僵死進程。這是一個開關式命令。

r:重新安排一個進程的優先級別。系統提示用戶輸入需要改變的進程PID以及需要設置的進程優先級值。輸入一個正值將使優先級降低,反之則可以使該進程擁有更高的優先權。默認值是10。

c:切換顯示命令名稱和完整命令行。

M:根據駐留內存大小進行排序。-------------常用

P:根據CPU使用百分比大小進行排序。-----------常用

H:顯示線程

3、常用參數與命令

d:指定每兩次屏幕信息刷新之間的時間間隔。當然用戶可以使用s交互命令來改變之。

p:通過指定監控進程ID來僅僅監控某個進程的狀態。

top –p PID

-H: 設置線程模式

顯示某個進程所有活躍的線程消耗情況

top -H -p pid

按f、再按j把P調出來,P代表”Last used CPU”

image

設置線程模式下:第二行的tasks指的是線程個數

image

4、疑問

如下這個java進程設置的最大可用內存爲128m,但是這裏virt達到了2478m,RES達到了295m,爲什麼?

image

參考答案:http://www.cnblogs.com/seasonsluo/p/java_virt.html

結論:

  • VIRT高是因爲分配了太多地址空間導致。
  • 一般來說不用太在意VIRT太高,因爲你有16EB的空間可以使用。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章