`
netcome
  • 浏览: 466608 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多


先介绍几个基本概念:

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脚本:

#!/usr/bin/perl

# Copyright Ben Maurer 
# you can distribute this under the MIT/X11 License

use Linux::Smaps;

my $pid=shift @ARGV;
unless ($pid) {
 print "./smem.pl <pid>\n";
 exit 1;
}
my $map=Linux::Smaps->new($pid);
my @VMAs = $map->vmas;

format STDOUT =
VMSIZE:  @######## kb
$map->size
RSS:     @######## kb total
$map->rss
         @######## kb shared
$map->shared_clean + $map->shared_dirty
         @######## kb private clean
$map->private_clean
         @######## kb private dirty
$map->private_dirty
.

write;
    
printPrivateMappings ();
printSharedMappings ();

sub sharedMappings () {
    return grep { ($_->shared_clean  + $_->shared_dirty) > 0 } @VMAs;
}

sub privateMappings () {
    return grep { ($_->private_clean  + $_->private_dirty) > 0 } @VMAs;
}

sub printPrivateMappings ()
{
    $TYPE = "PRIVATE MAPPINGS";
    $^ = 'SECTION_HEADER';
    $~ = 'SECTION_ITEM';
    $- = 0;
    $= = 100000000;
    foreach  $vma (sort {-($a->private_dirty <=> $b->private_dirty)} 
       privateMappings ()) {
 $size  = $vma->size;
 $dirty = $vma->private_dirty;
 $clean = $vma->private_clean;
 $file  = $vma->file_name;
 write;
    }
}

sub printSharedMappings ()
{
    $TYPE = "SHARED MAPPINGS";
    $^ = 'SECTION_HEADER';
    $~ = 'SECTION_ITEM';
    $- = 0;
    $= = 100000000;
    
    foreach  $vma (sort {-(($a->shared_clean + $a->shared_dirty)
      <=>
      ($b->shared_clean + $b->shared_dirty))} 
     sharedMappings ()) {
 
 $size  = $vma->size;
 $dirty = $vma->shared_dirty;
 $clean = $vma->shared_clean;
 $file  = $vma->file_name;
 write;
 
 
    }
}

format SECTION_HEADER =
@<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
$TYPE
@>>>>>>>>>> @>>>>>>>>>>  @>>>>>>>>>   @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
"vmsize" "rss clean" "rss dirty" "file"
.

format SECTION_ITEM =
@####### kb @####### kb @####### kb   @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
$size $clean $dirty $file
.

下面是由seme.pl脚本解析的smaps数据:

首先安装Linux::Smaps模块:
perl -MCPAN -e 'install Linux::Smaps'//需要网络,如无法上网,则可下载压缩包解压到 /root

然后用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.so
4 kb 0 kb 4 kb /lib/libc-2.4.so
12 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.so
108 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.so
4 kb 4 kb 0 kb [vdso]

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


http://hi.baidu.com/youngtao/blog/item/70621d83c72933a50cf4d29a.html

 

分享到:
评论

相关推荐

    linux 内存管理(虚拟地址到物理地址)

    该空间是块大小为4G的线性虚拟空间,用户所看到和接触到的都是该虚拟地址,无法看到实际的物理内存地址。利用这种虚拟地址不但能起到保护操作系统的效果(用户不能直接访问物理内存),而且更重要的是,用户程序可...

    VMMap 可以用来分析应用程序使用虚拟和物理内存的情况

    VMMap是一个免费的工具,可以用来分析应用程序使用虚拟和物理内存的情况。 VMMap对程序员是非常有用的。如果您在寻找免费的工具来理解和优化您的应用程序的内存使用量 ,那么你可以尝试VMMap。 除了内存使用图形来...

    window和linux和android进程内存CPU等监控软件

    1.面向window和linux和android三个平台。 2.线程可监控物理内存,虚拟内存,CPU和GPU等占用情况。 3.输出结果保存为exls或者csv可进行图形化分析。

    Linux服务器的系统内存监控方法详细解析

    内存管理系统是操作系统中最为重要的部分,因为系统的物理内存总是少于系统所需要的内存数量。虚拟内存就是为了克服这个矛盾而采用的策略。系统的虚拟内存通过在各个进程之间共享内存而使系统看起来有多于实际内存的...

    linux 虚拟地址与物理地址的关系

    当进程需要内存时,从内核获得的仅仅是虚拟的内存区域,而不是实际的物理地址,进程并没有获得物理内存,获得的仅仅是对一个新的线性地址区间的使用权。实际的物理内存只有当进程真的去访问新获取的虚拟地址时,才会...

    疯狂内核之——Linux虚拟内存

    1.4 Linux内存布局 21 1.5 内核空间和用户空间 23 1.5.1 初始化临时内核页表 24 1.5.2 永久内核页表的初始化 32 1.5.3 第一次进入用户空间 41 1.5.4 内核映射机制实例 44 1.6 固定映射的线性地址 48 1.7 高端内存...

    包含LINUX内核同步、信号、内存、调度、文件系统.rar

    内存管理 涉及到 物理内存管理 和 虚拟内存管理 , 是 Linux 内核中 最复杂的模块 ; 虚拟内存管理 包括 : 反向映射 , KSM , MMAP 映射 , 缺页中断 , 共享内存 , 进程虚拟地址空间管理 , 页面回收 ; 物理内存管理 ...

    Linux查看进程的内存占用情况

    1、top top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器  内容解释: ...  %MEM:进程使用的物理内存和总内存的百分比  TIME+:该进程

    第11讲-虚拟存储:缺页中断

    alloc()和mmap()等内存分配函数,在分配时只是建立了进程虚拟地址空间,并没有分配虚拟内存对应的物理内存。 当进程访问这些没有建立映射关系的虚拟内存时,处理器自动触发一个缺页异常。 缺页异常是Linux内存管理...

    嵌入式 Linux 内存管理

    虚拟内存与物理内存 内存测量 Linux内核对于进程内存的支持 堆 大块内存分配 内存释放 内存空洞 栈 栈上申请内存 栈的扩展 栈的释放 物理内存 ELF文件 bss 与 data section的区别 程序的运行 动态库...

    Linux操作系统的内存使用方法详细解析

    Linux在内存管理上份为两级,一级是线性区,一级是具体的物理页面,它对应我们机器上的物理内存。...注意一点,在进程只能访问虚拟内存,它实际上是看不到内核物理内存的使用,这对于进程是完全透明的。

    15.docx The Process Address Space

    Linux是虚拟内存操作系统,因此内存资源在系统上的各个进程之间被虚拟化。 单个进程的内存视图就好像它独自拥有对系统物理内存的完全访问权限一样。 更重要的是,即使单个进程的地址空间也可能比物理内存大得多。 ...

    linux学习笔记(包含Linux系统和shell编程).rar

    内核在交换空间和实际的物理内存之间反复交换虚拟内存中的内容。这使得系统以为自己拥有比物理内存更多的可用内存。 内存被划分为若干块,这些块称作页面(page)。内核会将每个内存页面置于物理内存或交换空间中。...

    Linux编程白皮书.rar

    简介 ...3.1 Linux进程 29 3.2 标识符 31 3.3 调度 32 3.4 文件 34 3.5 虚拟内存 35 3.6 创建进程 36 3.7 时间和定时器 37 3.8 执行程序 38 3.8.1 ELF 39 3.8.2 脚本文件 40 第4章 进程间通信机制 41

    linux优化笔记

    虚拟内存可以缓解物理内存的不足,但是虚拟内存的过多占用会导致应用程序的性能明显下降。 在一个32位处理器的linux系统中超过8GB的物理内存都将被浪费,因此要使用更大的内存,建议安装64位的操作系统,同时开启...

    LINUX原理与结构

    全书包括Linux概述、平台与工具、引导与初始化、中断处理、时钟管理、物理内存管理、进程管理、虚拟内存管理、互斥与同步、进程间通信、虚拟文件系统、物理文件系统、设备管理、电源管理等十四章,其主要内容已在...

    professional linux kernel architecture

    主要内容包括多任务、调度和进程管理,物理内存的管理以及内核与相关硬件的交互,用户空间的进程如何访问虚拟内存,如何编写设备驱动程序,模块机制以及虚拟文件系统,Ext文件系统属性和访问控制表的实现方式,内核...

    Linux虚拟地址空间布局

    在Linux系统中, 内核进程和用户进程所占的虚拟内存比例是1:3,而Windows系统为2:2(通过设置Large-Address-Aware Executables标志也可为1:3)。这并不意味着内核使用那么多物理内存,仅表示它可支配这部分地址空间,...

    内存管理内存管理内存管理

    物理内存和虚拟内存 要理解内存在程序中是如何分配的,首先需要理解如何将内存从操作系统分配给程序。计算机上的每一个进程都认为自己可以访问所有的物理内存。显然,由于同时在运行多个程序,所以每个进程不可能...

    Linux性能及调优指南:内存架构

    1.2 Linux内存架构  为了执行一个进程,Linux内核为请求的进程分配一部分内存...  1.2.1 物理和虚拟内存  我们已经要面对选择32位和64位系统的问题。对于企业级客户的其中一个重要的不同是虚拟内存的地址是否能

Global site tag (gtag.js) - Google Analytics