1. 程式人生 > >pmap : 理解linux的程序記憶體佔用

pmap : 理解linux的程序記憶體佔用

看了幾篇文章,對linux的程序的記憶體佔用,又有了一點認識,記錄一下。

首先 ps 看一下我的系統跑著哪些process

$ ps aux
 
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
...
czbug     1980  0.0  1.7 180472 34416 ?        Sl   Feb25   0:01 /usr/bin/yakuake
...

我拿 yakuake 這個小程式作例子。

其中,關於記憶體的是 VSZ 和 RSS 這兩個

man ps 看看它們的含義:

rss       RSS    resident set size, the non-swapped physical memory that a task has used (in kiloBytes). (alias rssize, rsz).

vsz       VSZ    virtual memory size of the process in KiB (1024-byte units). Device mappings are currently excluded; this is subject to change. (alias vsize).

簡單一點說,RSS 就是這個process 實際佔用的實體記憶體,VSZ 就是process 的虛擬記憶體,就是process 現在沒有使用但未來可能會分配的記憶體大小。

其實這裡的ps 出來的結果,是有點不正確的,如果把所有程式的 RSS 加起來,恐怕比你的實際記憶體還要大呢。為什麼呢??因為 ps 的結果,RSS 那部分,是包括共享記憶體的。這裡我用 pmap 來看看。

$ pmap -d 1980
 
1980:   /usr/bin/yakuake
Address   Kbytes Mode  Offset           Device    Mapping
00110000    2524 r-x-- 0000000000000000 008:00002 libkio.so.5.3.0
00387000       4 ----- 0000000000277000 008:00002 libkio.so.5.3.0
00388000      32 r---- 0000000000277000 008:00002 libkio.so.5.3.0
00390000      16 rw--- 000000000027f000 008:00002 libkio.so.5.3.0
00394000     444 r-x-- 0000000000000000 008:00002 libQtDBus.so.4.5.2
00403000       4
----- 000000000006f000 008:00002 libQtDBus.so.4.5.2 00404000       4 r---- 000000000006f000 008:00002 libQtDBus.so.4.5.2 00405000       4 rw--- 0000000000070000 008:00002 libQtDBus.so.4.5.2 00407000     228 r-x-- 0000000000000000 008:00002 libkparts.so.4.3.0 00440000       8 r---- 0000000000039000 008:00002 libkparts.so.4.3.0 00442000       4 rw--- 000000000003b000 008:00002 libkparts.so.4.3.0 00443000    3552 r-x-- 0000000000000000 008:00002 libkdeui.so.5.3.0 007bb000      76 r---- 0000000000377000 008:00002 libkdeui.so.5.3.0 007ce000      24 rw--- 000000000038a000 008:00002 libkdeui.so.5.3.0 007d4000       4 rw--- 0000000000000000 000:00000   [ anon ] .... mapped: 180472K    writeable/private: 19208K    shared: 20544K

我略去了一部分輸出,都是差不多的,重點在最後那行輸出。

linux 會把一些shared libraries 載入到記憶體中,在pmap 的輸出中,這些shared libraries 的名字通常是 lib*.so 。如 libX11.so.6.2.0 。這個 libX11.so.6.2.0 會被很多process load 到自己的執行環境中,同時,ps 輸出的RSS 結果中,每個process 都包含了這個libX11.so.6.2.0 ,而事實上它只被load 了一次,如果單純把ps 的結果相加,這樣就重複計算了。

而 pmap 的輸出中,writeable/private: 19208K ,這個就是yakuake 這個程式真正佔用的實體記憶體,不包含shared libraries 。在這裡,它只有19208K,而ps 的RSS 是34416K。

————————————————————–

我在看這方面的資料時,還看到一些關於virtual memory 的,再記錄下。

以下兩個命令均可檢視 vmsize 。

$ cat /proc/<pid>/stat | awk '{print $23 / 1024}'
$ cat /proc/<pid>/status | grep -i vmsize

一般來說,得出來的值,是和 ps 的 VSZ 是一樣的,但有一種情況例外,就是檢視X server 的時候。

舉個例:

$ ps aux|grep /usr/bin/X|grep -v grep | awk '{print $2}'   # 得出X server 的 pid   ...
1076
 
$ cat /proc/1076/stat | awk '{print $23 / 1024}'
139012
 
$ cat /proc/1076/status | grep -i vmsize
VmSize:      106516 kB

而 ps 的 VSZ 為 106516 ,與後者是一致的。

據說是因為

VmSize = memory + memory-mapped hardware (e.g. video card memory).

這句話我不是很理解。。。就不作解釋了。。。

對OS 的理解還很膚淺,還需努力啊。。。