用ps命令查看進程的內存
ps
命令是Linux下常見的查看進程狀況的程序,它有幾個字段可以用來查看進程內存使用情況:sz,rss,vsz。分別說明如下:
- sz:進程映像所佔用的物理頁面數量,也就是以物理頁面爲單位表示的虛擬內存大小;
- rss:進程當前所佔用的物理內存大小,單位爲kB;
- vsz:進程的虛擬內存大小,單位爲kB,它等於sz乘於物理頁面大小(x86平臺通常爲4kB)。
假如我要查看程序a.out的內存使用情況,操作如下:
$ ./a.out &[1] 10069 $ ps -O sz,rsz,vszPID SZ RSS VSZ S TTY TIME COMMAND 6793 1545 3648 6180 S pts/2 00:00:00 /bin/bash10069 404 304 1616 S pts/2 00:00:00 ./a.out10070 626 876 2504 R pts/2 00:00:00 ps -O sz,rss,vsz
上面ps命令的輸出的第3行就是./a.out自行後的相關情況。我們可以看出,它的虛擬 內存大小爲1616kB,當前佔用的物理內存爲304kB(其它數據在磁盤上或交換分區),虛 擬內存佔用404個物理頁面。由於我的機器的物理頁面大小爲4kB,可以驗證404 x 4kB等於1616kB。
用/proc文件系統查看進程的內存使用情況
ps命令的輸出關於內存的情況不是很詳細,尤其是進程所使用的內存中有很大一部分是共享庫函數使用的,因此通過ps命令的輸出看不到進程自己使用了多少內存。爲了查看更詳細的信息,可以藉助於/proc文件系統。這個文件系統並存在於磁盤上,但是可以象操作其它普通文件一樣操作它。它是Linux提供給用戶查看進程相關信息的接口。在/proc下有2個文件和進程內存有關:/proc/<pid>/status和/proc/<pid>/smaps。
通過/proc/<pid>/status可以查看進程的內存使用情況,包括虛擬內存大小(VmSize),物理內存大小(VmRSS),數據段大小(VmData),棧的大小(VmStk),代碼段的大小(VmExe),共享庫的代碼段大小(VmLib)等等。
$ cat /proc/10069/statusName: a.outState: S (sleeping)Tgid: 10069Pid: 10069PPid: 6793TracerPid: 0Uid: 1001 1001 1001 1001Gid: 1001 1001 1001 1001FDSize: 256Groups: 1000 1001 VmPeak: 1692 kBVmSize: 1616 kBVmLck: 0 kBVmHWM: 304 kBVmRSS: 304 kBVmData: 28 kBVmStk: 88 kBVmExe: 4 kBVmLib: 1464 kBVmPTE: 20 kBThreads: 1SigQ: 0/16382SigPnd: 0000000000000000ShdPnd: 0000000000000000SigBlk: 0000000000000000SigIgn: 0000000000000000SigCgt: 0000000000000000CapInh: 0000000000000000CapPrm: 0000000000000000CapEff: 0000000000000000CapBnd: ffffffffffffffffCpus_allowed: fCpus_allowed_list: 0-3Mems_allowed: 1Mems_allowed_list: 0voluntary_ctxt_switches: 1nonvoluntary_ctxt_switches: 1
注意,VmData,VmStk,VmExe和VmLib之和並不等於VmSize。這是因爲共享庫函數的數據段沒有計算進去(VmData僅包含a.out程序的數據段,不包括共享庫函數的數據段,也不包括通過mmap映射的區域。VmLib僅包括共享庫的代碼段,不包括共享庫的數據段)。
通過/proc/<pid>/smaps可以查看進程整個虛擬地址空間的映射情況,它的輸出從低地址到高地址按順序輸出每一個映射區域的相關信息,如下所示:
$ cat /proc/10069/smaps00110000-00263000 r-xp 00000000 08:07 128311 /lib/tls/i686/cmov/libc-2.11.1.soSize: 1356 kBRss: 148 kBPss: 8 kBShared_Clean: 148 kBShared_Dirty: 0 kBPrivate_Clean: 0 kBPrivate_Dirty: 0 kBReferenced: 148 kBSwap: 0 kBKernelPageSize: 4 kBMMUPageSize: 4 kB............bfd7f000-bfd94000 rw-p 00000000 00:00 0 [stack]Size: 88 kBRss: 8 kBPss: 8 kBShared_Clean: 0 kBShared_Dirty: 0 kBPrivate_Clean: 0 kBPrivate_Dirty: 8 kBReferenced: 8 kBSwap: 0 kBKernelPageSize: 4 kBMMUPageSize: 4 kB
注意:rwxp中,p表示私有映射(採用Copy-On-Write技術)。 Size字段就是該區域的大小。