Linux进程虚拟内存和物理内存

【原文: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/smaps00111000-00112000rwxp0011100000:000Size:4kBRss:4kBShared_Clean:0kBShared_Dirty:0kBPrivate_Clean:0kBPrivate_Dirty:4kB0050e000-0050f000 rwxp 0050e00000:000Size:4kBRss:0kBShared_Clean:0kBShared_Dirty:0kBPrivate_Clean:0kBPrivate_Dirty:0kB0051a000-0051b000 r-xp 0051a00000:000[vdso]Size:4kBRss:4kBShared_Clean:4kBShared_Dirty:0kBPrivate_Clean:0kBPrivate_Dirty:0kB0051b000-00534000r-xp00000000fd:00194898/lib/ld-2.4.soSize:100kBRss:0kBShared_Clean:0kBShared_Dirty:0kBPrivate_Clean:0kBPrivate_Dirty:0kB00534000-00535000r-xp00018000fd:00194898/lib/ld-2.4.soSize:4kBRss:0kBShared_Clean:0kBShared_Dirty:0kBPrivate_Clean:0kBPrivate_Dirty:0kB00535000-00536000rwxp00019000fd:00194898/lib/ld-2.4.soSize:4kBRss:0kBShared_Clean:0kBShared_Dirty:0kBPrivate_Clean:0kBPrivate_Dirty:0kB00538000-00665000r-xp00000000fd:00194905/lib/libc-2.4.soSize:1204kBRss:212kBShared_Clean:204kBShared_Dirty:0kBPrivate_Clean:8kBPrivate_Dirty:0kB00665000-00667000r-xp 0012d000 fd:00194905/lib/libc-2.4.soSize:8kBRss:8kBShared_Clean:4kBShared_Dirty:0kBPrivate_Clean:0kBPrivate_Dirty:4kB00667000-00668000rwxp 0012f000 fd:00194905/lib/libc-2.4.soSize:4kBRss:4kBShared_Clean:0kBShared_Dirty:0kBPrivate_Clean:0kBPrivate_Dirty:4kB00668000-0066b000 rwxp0066800000:000Size:12kBRss:8kBShared_Clean:0kBShared_Dirty:0kBPrivate_Clean:0kBPrivate_Dirty:8kB08047000-08062000r-xp00000000fd:00292327/usr/sbin/vmware-guestdSize:108kBRss:64kBShared_Clean:0kBShared_Dirty:0kBPrivate_Clean:64kBPrivate_Dirty:0kB08062000-08063000rwxp 0001a000 fd:00292327/usr/sbin/vmware-guestdSize:4kBRss:4kBShared_Clean:0kBShared_Dirty:0kBPrivate_Clean:0kBPrivate_Dirty:4kB08063000-08068000rwxp0806300000:000Size:20kBRss:12kBShared_Clean:0kBShared_Dirty:0kBPrivate_Clean:0kBPrivate_Dirty:12kB08385000-08886000rwxp0838500000:000[heap]Size:5124kBRss:5080kBShared_Clean:0kBShared_Dirty:0kBPrivate_Clean:0kBPrivate_Dirty:5080kBbfeb2000-bfec7000 rwxp bfeb200000:000[stack]Size:84kBRss:12kBShared_Clean:0kBShared_Dirty:0kBPrivate_Clean:0kBPrivate_Dirty:12kB

上面我们看到从smaps看不太方便, 推荐使用Ben Maurer写的perl脚本:

首先安装Linux::Smaps模块:perl -MCPAN -e 'install Linux::Smaps'//需要网络,如无法上网,可下载如下压缩包,解压到 /root
文件:cpan.rar大小:2905KB下载:下载

然后用seme.pl解析1293进程的Smaps数据:

CODE:# ./smem.pl1293VMSIZE:7200kbRSS:1052kb total192kb shared100kb private clean760kb private dirtyPRIVATE MAPPINGSvmsize rss clean rss dirty file5636kb8kb724kb[heap]84kb0kb12kb[stack]4kb0kb4kb8kb0kb4kb /lib/libc-2.4.so4kb0kb4kb /lib/libc-2.4.so12kb4kb4kb4kb0kb4kb /usr/sbin/vmware-guestd20kb8kb4kb1204kb16kb0kb /lib/libc-2.4.so108kb64kb0kb /usr/sbin/vmware-guestd

SHARED MAPPINGSvmsize rss clean rss dirty file1204kb188kb0kb /lib/libc-2.4.so4kb4kb0kb[vdso]

从上面看到rss大小被分成了两个部分: private(私有)和shared(共享).private rss就是我们最关心的进程实际占用的内存数.

每一天都是一个阶梯,是向既定目标迈进的新的一步。

Linux进程虚拟内存和物理内存

相关文章:

你感兴趣的文章:

标签云: