2:輸入大寫P,則結果按CPU佔用降序排序。輸入大寫M,結果按內存佔用降序排序。
另外:
認識top的顯示結果
top命令的顯示結果以下所示:
top - 01:06:48 up 1:22, 1 user, load average: 0.06, 0.60, 0.48 Tasks: 29 total, 1 running, 28 sleeping, 0 stopped, 0 zombie Cpu(s): 0.3% us, 1.0% sy, 0.0% ni, 98.7% id, 0.0% wa, 0.0% hi, 0.0% si Mem: 191272k total, 173656k used, 17616k free, 22052k buffers Swap: 192772k total, 0k used, 192772k free, 123988k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1379 root 16 0 7976 2456 1980 S 0.7 1.3 0:11.03 sshd 14704 root 16 0 2128 980 796 R 0.7 0.5 0:02.72 top 1 root 16 0 1992 632 544 S 0.0 0.3 0:00.90 init 2 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/0 3 root RT 0 0 0 0 S 0.0 0.0 0:00.00 watchdog/0統計信息區
前五行是系統總體的統計信息。第一行是任務隊列信息,同 uptime 命令的執行結果。其內容以下:
01:06:48 當前時間
up 1:22 系統運行時間,格式爲時:分
1 user 當前登陸用戶數
load average: 0.06, 0.60, 0.48 系統負載,即任務隊列的平均長度。
三個數值分別爲 1分鐘、5分鐘、15分鐘前到如今的平均值。
第2、三行爲進程和CPU的信息。當有多個CPU時,這些內容可能會超過兩行。內容以下:
Tasks: 29 total 進程總數
1 running 正在運行的進程數
28 sleeping 睡眠的進程數
0 stopped 中止的進程數
0 zombie 殭屍進程數
Cpu(s): 0.3% us 用戶空間佔用CPU百分比
1.0% sy 內核空間佔用CPU百分比
0.0% ni 用戶進程空間內改變過優先級的進程佔用CPU百分比
98.7% id 空閒CPU百分比
0.0% wa 等待輸入輸出的CPU時間百分比
0.0% hi
0.0% si
最後兩行爲內存信息。內容以下:
Mem: 191272k total 物理內存總量
173656k used 使用的物理內存總量
17616k free 空閒內存總量
22052k buffers 用做內核緩存的內存量
Swap: 192772k total 交換區總量
0k used 使用的交換區總量
192772k free 空閒交換區總量
123988k cached 緩衝的交換區總量。
內存中的內容被換出到交換區,然後又被換入到內存,但使用過的交換區還沒有被覆蓋,
該數值即爲這些內容已存在於內存中的交換區的大小。
相應的內存再次被換出時可沒必要再對交換區寫入。
進程信息區
統計信息區域的下方顯示了各個進程的詳細信息。首先來認識一下各列的含義。
序號 列名 含義
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 鍵能夠將當前的排序倒轉。緩存
/////app
%mem 內存使用率
virt 是虛擬內存
res是常駐內存
shr是共享內存
top命令下按f鍵能夠看到詳細說明
* A: PID = Process Id
* E: USER = User Name
* H: PR = Priority
* I: NI = Nice value
* O: VIRT = Virtual Image (kb)
* Q: RES = Resident size (kb)
* T: SHR = Shared Mem size (kb)
* W: S = Process Status
* K: %CPU = CPU usage
* N: %MEM = Memory usage (RES)
* M: TIME+ = CPU Time, hundredths
b: PPID = Parent Process Pid
c: RUSER = Real user name
d: UID = User Id
f: GROUP = Group Name
g: TTY = Controlling Tty
j: P = Last used cpu (SMP)
p: SWAP = Swapped size (kb)
l: TIME = CPU Time
r: CODE = Code size (kb)
s: DATA = Data+Stack size (kb)
u: nFLT = Page Fault count
v: nDRT = Dirty Pages count
y: WCHAN = Sleeping in Function
z: Flags = Task Flags <sched.h>
* X: COMMAND = Command name/line
top命令下要查看某個用戶啓動的進程:先輸入u,而後輸入用戶名,再回車
VIRT:virtual memory usage。Virtual這個詞很神,通常解釋是:virtual adj.虛的, 實質的, [物]有效的, 事實上的。究竟是虛的仍是實的?讓Google給Define以後,將就明白一點,就是這東西仍是非物質的,可是有效果的,不發生在真實世界的,發生在軟件世界的等等。這個內存使用就是一個應用佔有的地址空間,只是要應用程序要求的,就全算在這裏,而無論它真的用了沒有。寫程序怕出錯,又不在意佔用的時候,多開點內存也是很正常的。
RES:resident memory usage。常駐內存。這個值就是該應用程序真的使用的內存,但還有兩個小問題,一是有些東西可能放在交換盤上了(SWAP),二是有些內存多是共享的。
SHR:shared memory。共享內存。就是說這一塊內存空間有可能也被其餘應用程序使用着;而Virt - Shr彷佛就是這個程序所要求的而且沒有共享的內存空間。
DATA:數據佔用的內存。若是top沒有顯示,按f鍵能夠顯示出來。這一塊是真正的該程序要求的數據空間,是真正在運行中要使用的。
============================================
top裏面描述進程內存使用量的數據來源於/proc/$pid/statm這個文件。經過觀察kernel的代碼就能弄清楚SHR,VIRT和RES這些數值的具體含義。
Linux經過一個叫作 task_statm 的函數來返回進程的內存使用情況
int task_statm(struct mm_struct *mm, int *shared, int *text,
int *data, int *resident)
{
*shared = get_mm_counter(mm, file_rss);
*text = (PAGE_ALIGN(mm->end_code) - (mm->start_code & PAGE_MASK))
>> PAGE_SHIFT;
*data = mm->total_vm - mm->shared_vm;
*resident = *shared + get_mm_counter(mm, anon_rss);
return mm->total_vm;
}
上面的代碼中shared就是page cache裏面實際使用了的物理內存的頁數,text是代碼所佔用的頁
數,data是總虛擬內存頁數減去共享的虛擬內存頁數,resident是全部在使用的物理內存的頁
數。最後返回的mm->total_vm是進程虛擬內存的尋址空間大小。
函數get_mm_counter並不會作什麼計算,它的功能是保證數值讀取的原子性。
上面的數值最後會經過 procfs輸出 到/proc/$pid/statm中去。他們與top顯示的數值對應關係以下。
SHR: shared
RES: resident
VIRT: mm->total_vm
CODE: code
DATA: data
=======================================
o: VIRT (Virtual Image) - 進程使用的總虛擬內存 (virtual memory) 大小,包括進程的程序碼、資料和共享程序庫再加上被置換 (swap out) 的空間。VIRT = SWAP + RES
p: SWAP (Swapped size) - 進程被置換的虛擬內存空間大小。
q: RES (Resident size) - 進程非被置換的實體內存大小。RES = CODE + DATA
r: CODE' (Code size) - 進程的程序碼在實體內存佔用空間大小,亦叫做 text resident set (TRS)。
s: DATA (Data+Stack size) - 進程佔用實體內存中的非程序碼部份大小,亦叫做 data resident set (DRS)。
t: SHR (Shared Mem size) - 進程使用的共享內存大小,便可以和其餘進程共享的內存空間。
n: %MEM (Memory usage) - 進程佔用實體內存大小對系統總實體內存大小的比例,以百分比顯示。
ssh