Linux TOP命令 按內存佔用排序和按CPU佔用排序

1:在命令行提示符執行top命令


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

相關文章
相關標籤/搜索