top 命令

weixin_34162629發表於2018-11-22

首先介紹top中一些欄位的含義:

VIRT:virtual memory usage 虛擬記憶體1、程式“需要的”虛擬記憶體大小,包括程式使用的庫、程式碼、資料等
2、假如程式申請100m的記憶體,但實際只使用了10m,那麼它會增長100m,而不是實際的使用量

RES:resident memory usage 常駐記憶體
1、程式當前使用的記憶體大小,但不包括swap out
2、包含其他程式的共享
3、如果申請100m的記憶體,實際使用10m,它只增長10m,與VIRT相反
4、關於庫佔用記憶體的情況,它只統計載入的庫檔案所佔記憶體大小

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

DATA
1、資料佔用的記憶體。如果top沒有顯示,按f鍵可以顯示出來。
2、真正的該程式要求的資料空間,是真正在執行中要使用的。

top 執行中可以通過 top 的內部命令對程式的顯示方式進行控制。內部命令如下:
s – 改變畫面更新頻率
l – 關閉或開啟第一部分第一行 top 資訊的表示
t – 關閉或開啟第一部分第二行 Tasks 和第三行 Cpus 資訊的表示
m – 關閉或開啟第一部分第四行 Mem 和 第五行 Swap 資訊的表示
N – 以 PID 的大小的順序排列表示程式列表
P – 以 CPU 佔用率大小的順序排列程式列表
M – 以記憶體佔用率大小的順序排列程式列表
h – 顯示幫助
n – 設定在程式列表所顯示程式的數量
q – 退出 top
s – 改變畫面更新週期

序號 列名 含義
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 即可顯示或隱藏對應的列,最後按Enter鍵確定。
按 o 鍵可以改變列的顯示順序。按小寫的 a-z 可以將相應的列向右移動,而大寫的 A-Z 可以將相應的列向左移動。最後按Enter鍵確定。
按大寫的 F 或 O 鍵,然後按 a-z 可以將程式按照相應的列進行排序。而大寫的 R 鍵可以將當前的排序倒轉。

top使用方法:

使用格式:

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

引數說明:

d:指定每兩次螢幕資訊重新整理之間的時間間隔。當然使用者可以使用s互動命令來改變之。

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

q:該選項將使top沒有任何延遲的進行重新整理。如果呼叫程式有超級使用者許可權,那麼top將以儘可能高的優先順序執行。

S:指定累計模式。

s:使top命令在安全模式中執行。這將去除互動命令所帶來的潛在危險。

i:使top不顯示任何閒置或者僵死程式。

c:顯示整個命令列而不只是顯示命令名。

常用命令說明:

Ctrl+L:擦除並且重寫螢幕

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檔案中。

檢視多核CPU命令mpstat -P ALL 和 sar -P ALL

**說明:**sar -P ALL > aaa.txt 重定向輸出內容到檔案 aaa.txt

top命令經常用來監控Linux的系統狀況,比如cpu、記憶體的使用,程式設計師基本都知道這個命令,但比較奇怪的是能用好它的人卻很少,例如top監控檢視中記憶體數值的含義就有不少的曲解。

本文通過一個執行中的WEB伺服器的top監控截圖,講述top檢視中的各種資料的含義,還包括檢視中各程式(任務)的欄位的排序。

一、輸入top命令


1. 1.1 系統執行時間和平均負載:

top命令的頂部顯示與uptime命令相似的輸出

這些欄位顯示:

  • 當前時間
  • 系統已執行的時間
  • 當前登入使用者的數量
  • 相應最近5、10和15分鐘內的平均負載。

可以使用'l'命令切換uptime的顯示。

21:45:11 — 當前系統時間
0 days, 4:54 — 系統已經執行了4小時54分鐘(在這期間沒有重啟過)
2 users — 當前有2個使用者登入系統
load average:0.24, 0.15, 0.19 — load average後面的三個數分別是5分鐘、10分鐘、15分鐘的負載情況。

load average資料是每隔5秒鐘檢查一次活躍的程式數,然後按特定演算法計算出的數值。如果這個數除以邏輯CPU的數量,結果高於5的時候就表明系統在超負荷運轉了。

2. 1.2 任務:

Tasks — 任務(程式),系統現在共有144個程式,其中處於執行中的有1個,143個在休眠(sleep),stoped狀態的有0個,zombie狀態(殭屍)的有0個。

第二行顯示的是任務或者程式的總結。程式可以處於不同的狀態。這裡顯示了全部程式的數量。除此之外,還有正在執行、睡眠、停止、殭屍程式的數量(殭屍是一種程式的狀態)。這些程式概括資訊可以用't'切換顯示

3. 1.3 CPU 狀態:

這裡顯示不同模式下所佔cpu時間百分比,這些不同的cpu時間表示:

  • us, user: 執行(未調整優先順序的) 使用者程式的CPU時間
  • sy,system: 執行核心程式的CPU時間
  • ni,niced:執行已調整優先順序的使用者程式的CPU時間
  • wa,IO wait: 用於等待IO完成的CPU時間
  • hi:處理硬體中斷的CPU時間
  • si: 處理軟體中斷的CPU時間
  • st:這個虛擬機器被hypervisor偷去的CPU時間(譯註:如果當前處於一個hypervisor下的vm,實際上hypervisor也是要消耗一部分CPU處理時間的)。

可以使用't'命令切換顯示。

1.3% us — 使用者空間佔用CPU的百分比。

1.0% sy — 核心空間佔用CPU的百分比。

0.0% ni — 改變過優先順序的程式佔用CPU的百分比

97.3% id — 空閒CPU百分比

0.0% wa — IO等待佔用CPU的百分比

0.3% hi — 硬中斷(Hardware IRQ)佔用CPU的百分比

0.0% si — 軟中斷(Software Interrupts)佔用CPU的百分比

在這裡CPU的使用比率和windows概念不同,如果你不理解使用者空間和核心空間,需要充充電了。

4. 1.4 記憶體使用:

接下來兩行顯示記憶體使用率,有點像'free'命令。第一行是實體記憶體使用,第二行是虛擬記憶體使用(交換空間)。

實體記憶體顯示如下:全部可用記憶體、已使用記憶體、空閒記憶體、緩衝記憶體。相似地:交換部分顯示的是:全部、已使用、空閒和緩衝交換空間。

記憶體顯示可以用'm'命令切換。

509248k total — 實體記憶體總量(509M)
495964k used — 使用中的記憶體總量(495M)
13284k free — 空閒記憶體總量(13M)
25364k buffers — 快取的記憶體量 (25M)

swap交換分割槽
492536k total — 交換區總量(492M)
11856k used — 使用的交換區總量(11M)
480680k free — 空閒交換區總量(480M)
202224k cached — 緩衝的交換區總量(202M)

這裡要說明的是不能用windows的記憶體概念理解這些資料,如果按windows的方式此臺伺服器“危矣”:8G的記憶體總量只剩下530M的可用記憶體。Linux的記憶體管理有其特殊性,複雜點需要一本書來說明,這裡只是簡單說點和我們傳統概念(windows)的不同。

第四行中使用中的記憶體總量(used)指的是現在系統核心控制的記憶體數,空閒記憶體總量(free)是核心還未納入其管控範圍的數量。納入核心管理的記憶體不見得都在使用中,還包括過去使用過的現在可以被重複利用的記憶體,核心並不把這些可被重新使用的記憶體交還到free中去,因此在linux上free記憶體會越來越少,但不用為此擔心。

如果出於習慣去計算可用記憶體數,這裡有個近似的計算公式:第四行的free + 第四行的buffers + 第五行的cached,按這個公式此臺伺服器的可用記憶體:

13284+25364+202224 = 240M。

對於記憶體監控,在top裡我們要時刻監控第五行swap交換分割槽的used,如果這個數值在不斷的變化,說明核心在不斷進行記憶體和swap的資料交換,這是真正的記憶體不夠用了。

第六行是空行

5. 1.5 各程式(任務)的狀態監控:

PID:程式ID,程式的唯一識別符號

USER:程式所有者的實際使用者名稱。

PR:程式的排程優先順序。這個欄位的一些值是'rt'。這意味這這些程式執行在實時態。

NI:程式的nice值(優先順序)。越小的值意味著越高的優先順序。負值表示高優先順序,正值表示低優先順序

VIRT:程式使用的虛擬記憶體。程式使用的虛擬記憶體總量,單位kb。VIRT=SWAP+RES

RES:駐留記憶體大小。駐留記憶體是任務使用的非交換實體記憶體大小。程式使用的、未被換出的實體記憶體大小,單位kb。RES=CODE+DATA

SHR:SHR是程式使用的共享記憶體。共享記憶體大小,單位kb

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

  • D - 不可中斷的睡眠態。
  • R – 執行態
  • S – 睡眠態
  • T – 被跟蹤或已停止
  • Z – 殭屍態

%CPU:自從上一次更新時到現在任務所使用的CPU時間百分比。

%MEM:程式使用的可用實體記憶體百分比。

TIME+:任務啟動後到現在所使用的全部CPU時間,精確到百分之一秒。

COMMAND:執行程式所使用的命令。程式名稱(命令名/命令列)

還有許多在預設情況下不會顯示的輸出,它們可以顯示程式的頁錯誤、有效組和組ID和其他更多的資訊。

二、互動命令

1. 2.1 ‘h’: 幫助

可以用h或?顯示互動命令的幫助選單。


2. 2.2 ‘’ 或者 ‘’: 重新整理顯示

top命令預設在一個特定間隔(3秒)後重新整理顯示。要手動重新整理,使用者可以輸入回車或者空格。

多U多核CPU監控在top基本檢視中,按鍵盤數字“1”,可監控每個邏輯CPU的狀況:

top檢視 02

top檢視 02

觀察上圖,伺服器有16個邏輯CPU,實際上是4個物理CPU。

程式欄位排序預設進入top時,各程式是按照CPU的佔用量來排序的,在【top檢視 01】中程式ID為14210的Java程式排在第一(cpu佔用100%),程式ID為14183的java程式排在第二(cpu佔用12%)。可通過鍵盤指令來改變排序欄位,比如想監控哪個程式佔用MEM最多,我一般的使用方法如下:

\1. 敲擊鍵盤“b”(開啟/關閉加亮效果),top的檢視變化如下:

top檢視 03

top檢視 03

我們發現程式id為10704的“top”程式被加亮了,top程式就是檢視第二行顯示的唯一的執行態(runing)的那個程式,可以通過敲擊“y”鍵關閉或開啟執行態程式的加亮效果。

\2. 敲擊鍵盤“x”(開啟/關閉排序列的加亮效果),top的檢視變化如下:

top檢視 04

top檢視 04

可以看到,top預設的排序列是“%CPU”。

\3. 通過”shift + >”或”shift + <”可以向右或左改變排序列,下圖是按一次”shift + >”的效果圖:

top檢視 05

top檢視 05

檢視現在已經按照%MEM來排序了。

改變程式顯示欄位

\1. 敲擊“f”鍵,top進入另一個檢視,在這裡可以編排基本檢視中的顯示欄位:

top檢視 06

top檢視 06

這裡列出了所有可在top基本檢視中顯示的程式欄位,有””並且標註為大寫字母的欄位是可顯示的,沒有””並且是小寫字母的欄位是不顯示的。如果要在基本檢視中顯示“CODE”和“DATA”兩個欄位,可以通過敲擊“r”和“s”鍵:

top檢視 07

top檢視 07

\2. “回車”返回基本檢視,可以看到多了“CODE”和“DATA”兩個欄位:

top檢視 08

top檢視 08

top命令的補充top命令是Linux上進行系統監控的首選命令,但有時候卻達不到我們的要求,比如當前這臺伺服器,top監控有很大的侷限性。這臺伺服器執行著websphere叢集,有兩個節點服務,就是【top檢視 01】中的老大、老二兩個java程式,top命令的監控最小單位是程式,所以看不到我關心的java執行緒數和客戶連線數,而這兩個指標是java的web服務非常重要的指標,通常我用ps和netstate兩個命令來補充top的不足。

複製程式碼 程式碼如下:

監控java執行緒數:
ps -eLf | grep java | wc -l

複製程式碼 程式碼如下:

監控網路客戶連線數:
netstat -n | grep tcp | grep 偵聽埠 | wc -l

上面兩個命令,可改動grep的引數,來達到更細緻的監控要求。
在Linux系統“一切都是檔案”的思想貫徹指導下,所有程式的執行狀態都可以用檔案來獲取。系統根目錄/proc中,每一個數字子目錄的名字都是執行中的程式的PID,進入任一個程式目錄,可通過其中檔案或目錄來觀察程式的各項執行指標,例如task目錄就是用來描述程式中執行緒的,因此也可以通過下面的方法獲取某程式中執行中的執行緒數量(PID指的是程式ID):

複製程式碼 程式碼如下:

ls /proc/PID/task | wc -l

在linux中還有一個命令pmap,來輸出程式記憶體的狀況,可以用來分析執行緒堆疊:

複製程式碼 程式碼如下:

pmap PID