【原文:
http://blog.chinaunix.net/uid-1746930-id-2796486.html】

文件:
htop-0.8.1.tar.gz
大小:
405KB
下载:
下载

文件:
嵌入式linux性能分析.pdf
大小:
2056KB
下载:
下载

文件:
exmap-0.9.tar.gz
大小:
111KB
下载:
下载
先介绍几个基本概念:
SIZE: 进程使用的地址空间, 如果进程映射了100M的内存, 进程的地址空间将报告为100M内存. 事实上, 这个大小不是一个程序实际使用的内存数.
RSS: "Resident Set Size", 实际驻留"在内存中"的内存数. 不包括已经交换出去的代码. 举一个例子: 如果你有一个程序使用了100K内存, 操作系统交换出40K内存, 那么RSS为60K. RSS还包括了与其它进程共享的内存区域. 这些区域通常用于libc库等.
SHARE: RSS中与其它进程共享的内存部分大小.
VMSIZE: 一个进程占用的总的地址空间大小. 它包括了没有映射到内存中的页面.
Private RSS: 映射到内存中的页面, 这些页面仅由进程单独使用. 这也是我们最关心地方: 进程实际占用的内存数.
如何来查看Private RSS呢? /proc接口中每一个进程目录下的smaps提供了private rss信息. smaps是在2.6.16内核版本引进来的.
私有驻留内存数(Private RSS):
查看/proc/$pid/smaps
下面以Linux AS5为例, 查看进程号1293(vmware-guestd, 本站使用的是一台基于vmware的客户虚拟机,)使用的Private RSS数.
CODE:
# cat /proc/
1293/smaps
00111000-
00112000 rwxp
00111000 00:
00 0
Size:
4 kB
Rss:
4 kB
Shared_Clean:
0 kB
Shared_Dirty:
0 kB
Private_Clean:
0 kB
Private_Dirty:
4 kB
0050e000-0050f000 rwxp 0050e000
00:
00 0
Size:
4 kB
Rss:
0 kB
Shared_Clean:
0 kB
Shared_Dirty:
0 kB
Private_Clean:
0 kB
Private_Dirty:
0 kB
0051a000-0051b000 r-xp 0051a000
00:
00 0 [vdso
]
Size:
4 kB
Rss:
4 kB
Shared_Clean:
4 kB
Shared_Dirty:
0 kB
Private_Clean:
0 kB
Private_Dirty:
0 kB
0051b000-
00534000 r-xp
00000000 fd:
00 194898 /lib/ld-
2.
4.
so
Size:
100 kB
Rss:
0 kB
Shared_Clean:
0 kB
Shared_Dirty:
0 kB
Private_Clean:
0 kB
Private_Dirty:
0 kB
00534000-
00535000 r-xp
00018000 fd:
00 194898 /lib/ld-
2.
4.
so
Size:
4 kB
Rss:
0 kB
Shared_Clean:
0 kB
Shared_Dirty:
0 kB
Private_Clean:
0 kB
Private_Dirty:
0 kB
00535000-
00536000 rwxp
00019000 fd:
00 194898 /lib/ld-
2.
4.
so
Size:
4 kB
Rss:
0 kB
Shared_Clean:
0 kB
Shared_Dirty:
0 kB
Private_Clean:
0 kB
Private_Dirty:
0 kB
00538000-
00665000 r-xp
00000000 fd:
00 194905 /lib/libc-
2.
4.
so
Size:
1204 kB
Rss:
212 kB
Shared_Clean:
204 kB
Shared_Dirty:
0 kB
Private_Clean:
8 kB
Private_Dirty:
0 kB
00665000-
00667000 r-xp 0012d000 fd:
00 194905 /lib/libc-
2.
4.
so
Size:
8 kB
Rss:
8 kB
Shared_Clean:
4 kB
Shared_Dirty:
0 kB
Private_Clean:
0 kB
Private_Dirty:
4 kB
00667000-
00668000 rwxp 0012f000 fd:
00 194905 /lib/libc-
2.
4.
so
Size:
4 kB
Rss:
4 kB
Shared_Clean:
0 kB
Shared_Dirty:
0 kB
Private_Clean:
0 kB
Private_Dirty:
4 kB
00668000-0066b000 rwxp
00668000 00:
00 0
Size:
12 kB
Rss:
8 kB
Shared_Clean:
0 kB
Shared_Dirty:
0 kB
Private_Clean:
0 kB
Private_Dirty:
8 kB
08047000-
08062000 r-xp
00000000 fd:
00 292327 /usr/sbin/vmware-guestd
Size:
108 kB
Rss:
64 kB
Shared_Clean:
0 kB
Shared_Dirty:
0 kB
Private_Clean:
64 kB
Private_Dirty:
0 kB
08062000-
08063000 rwxp 0001a000 fd:
00 292327 /usr/sbin/vmware-guestd
Size:
4 kB
Rss:
4 kB
Shared_Clean:
0 kB
Shared_Dirty:
0 kB
Private_Clean:
0 kB
Private_Dirty:
4 kB
08063000-
08068000 rwxp
08063000 00:
00 0
Size:
20 kB
Rss:
12 kB
Shared_Clean:
0 kB
Shared_Dirty:
0 kB
Private_Clean:
0 kB
Private_Dirty:
12 kB
08385000-
08886000 rwxp
08385000 00:
00 0 [heap
]
Size:
5124 kB
Rss:
5080 kB
Shared_Clean:
0 kB
Shared_Dirty:
0 kB
Private_Clean:
0 kB
Private_Dirty:
5080 kB
bfeb2000-bfec7000 rwxp bfeb2000
00:
00 0 [stack
]
Size:
84 kB
Rss:
12 kB
Shared_Clean:
0 kB
Shared_Dirty:
0 kB
Private_Clean:
0 kB
Private_Dirty:
12 kB
上面我们看到从smaps看不太方便, 推荐使用Ben Maurer写的perl脚本:
首先安装Linux::Smaps模块:
perl -MCPAN -e 'install Linux::Smaps'//需要网络,如无法上网,可下载如下压缩包,解压到 /root

文件:
cpan.rar
大小:
2905KB
下载:
下载
然后用seme.pl解析1293进程的Smaps数据:
CODE:
# ./smem.
pl 1293
VMSIZE:
7200 kb
RSS:
1052 kb total
192 kb shared
100 kb private clean
760 kb private dirty
PRIVATE MAPPINGS
vmsize rss clean rss dirty file
5636 kb
8 kb
724 kb
[heap
]84 kb
0 kb
12 kb
[stack
]4 kb
0 kb
4 kb
8 kb
0 kb
4 kb /lib/libc-
2.
4.
so4 kb
0 kb
4 kb /lib/libc-
2.
4.
so12 kb
4 kb
4 kb
4 kb
0 kb
4 kb /usr/sbin/vmware-guestd
20 kb
8 kb
4 kb
1204 kb
16 kb
0 kb /lib/libc-
2.
4.
so108 kb
64 kb
0 kb /usr/sbin/vmware-guestd
SHARED MAPPINGS
vmsize rss clean rss dirty file
1204 kb
188 kb
0 kb /lib/libc-
2.
4.
so4 kb
4 kb
0 kb
[vdso
]
从上面看到rss大小被分成了两个部分: private(私有)和shared(共享).
private rss就是我们最关心的进程实际占用的内存数.