linux下的top命令參數說明

Top裡面描述進程記憶體使用量的資料來源於/proc/$pid/statm這個檔。通過觀察kernel的代碼就能弄清楚SHR,VIRT和RES這些數值的具體含義。

%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
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
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) – 進程佔用實體記憶體大小對系統總實體記憶體大小的比例,以百分比顯示。

Be the first to comment

Leave a Reply

Your email address will not be published.