对private内存、virtual内存的一些讲解

对private内存、virtual内存的一些讲解

Note : This guide is applicable to Linux kernels 2.6.14 and above, which adds support for smaps, per-mapping data, including data on each mapping's rss usage.

Most Admins and Developers are used to retrieve memory usage information of a process with VMSTAT or RSS, but these are not accurate,

VMSIZE counts pages that are not mapped in to memory.

RSS multi-counts shared pages, and hence is also more or less useless.

But fortunately, form kernel 2.6.14 (November 2005) onwards, has support for smaps, per-mapping data, including data on each mapping's rss usage.

This mapping data resides in /proc/$pid/smaps.

But it is not easily comprehend-able and lists all private regions and public region usage separately.

we can use this following script written by Ben Maurer, undergraduate at Carnegie Mellon University ( can reach him at, 
[email protected]), many thanks to him.

The perl script follows below, which uses the following perl modules, But before that make sure that you have the following perl module, which is perls interface for smap facility.

Linux::Smaps ( this in turn depends on Class::Member 1.3 )

So if the modules are not there in your system, than get them form the following links.

1.) 
http://search.cpan.org/CPAN/authors/id/O/OP/OPI/Linux-Smaps-0.01.tar.gz

2.) 
http://search.cpan.org/CPAN/authors/id/O/OP/OPI/Class-Member-1.3.tar.gz

to install these two , decompress both as follows :

Code:

bash # gunzip -v ./Class-Member-1.3.tar.gz ; tar xvf ./Class-Member-1.3.tar
bash # cd ./Class-Member-1.3
bash # perl Makefile.PL
bash # make
bash # make test
bash # make install

bash # gunzip -v ./Linux-Smaps-0.01.tar.gz ; tar xvf ./Linux-Smaps-0.01.tar
bash # cd ./Linux-Smaps-0.01
bash # perl Makefile.PL
bash # make
bash # make test
bash # make install



Now you can run the following script, with pid as the argument name. To get the complete memory statistics of a particular process.

Code:

#!/usr/bin/perl
#smaps.pl
#typical usage is as follows :
# smaps.pl pid 

use Linux::Smaps;

my $pid=shift @ARGV;
unless ($pid) {
        print "./smem.pl \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
.



save this file as SCRIPTNAME.pl . I have saved this script as smaps.pl.

Now assume that, you want to see memory usage statistics for the Firefox process running on the system ( useful to detect firefox memory leak problem .. . ) .

Make sure smaps.pl is in your path and Just run

Code:

[bash] # pgrep firefox | xargs smaps.pl 



you get the following output :

Code:

[root@chandan-gateway chandan]# pgrep firefox | xargs ./smaps.pl
VMSIZE:    240304 kb
RSS:        97392 kb total
              6512 kb shared
            21952 kb private clean
            68928 kb private dirty
PRIVATE MAPPINGS
    vmsize  rss clean  rss dirty  file
  54624 kb        0 kb    54384 kb
  10316 kb        0 kb    10316 kb
    376 kb        0 kb      376 kb  /SYSV00000000 (deleted)
    376 kb        0 kb      376 kb  /SYSV00000000 (deleted)
    372 kb        0 kb      372 kb  /usr/lib/firefox-2.0.0.4/components/libgklayout.so
    296 kb        0 kb      296 kb  /SYSV00000000 (deleted)
      24 kb        0 kb      24 kb  /usr/lib/firefox-2.0.0.4/components/libuconv.so
      20 kb        0 kb      20 kb  /usr/lib/firefox-2.0.0.4/libmozjs.so
      16 kb        0 kb      16 kb  /usr/lib/firefox-2.0.0.4/components/libxpconnect.so
      4 kb        0 kb        4 kb  /usr/lib/firefox-2.0.0.4/components/libtxmgr.so
      4 kb        0 kb        4 kb  /lib/libnss_dns-2.6.so
      4 kb        0 kb        4 kb  /lib/libnss_dns-2.6.so
      4 kb        0 kb        4 kb  /usr/lib/firefox-2.0.0.4/components/libnecko2.so
      4 kb        0 kb        4 kb  /usr/lib/firefox-2.0.0.4/components/libremoteservice.so
      60 kb      44 kb        0 kb  /usr/lib/firefox-2.0.0.4/components/libmyspell.so
      16 kb      12 kb        0 kb  /usr/lib/firefox-2.0.0.4/libgtkxtbin.so
      24 kb      16 kb        0 kb  /usr/lib/libpangoxft-1.0.so.0.1600.4
    104 kb      68 kb        0 kb  /usr/lib/firefox-2.0.0.4/components/libchrome.so
    120 kb      80 kb        0 kb  /usr/lib/firefox-2.0.0.4/components/libcaps.so
      80 kb      60 kb        0 kb  /usr/lib/libbonobo-activation.so.4.0.0
      8 kb        8 kb        0 kb  /usr/lib/libavahi-glib.so.1.0.1
    248 kb      168 kb        0 kb  /usr/lib/firefox-2.0.0.4/components/libwidget_gtk2.so
    444 kb      268 kb        0 kb  /usr/lib/firefox-2.0.0.4/components/libtoolkitcomps.so
      16 kb      12 kb        0 kb  /usr/lib/libORBitCosNaming-2.so.0.1.0
      88 kb      56 kb        0 kb  /usr/lib/firefox-2.0.0.4/components/libpref.so
    1100 kb      624 kb        0 kb  /usr/lib/firefox-2.0.0.4/components/libnecko.so
    132 kb      64 kb        0 kb  /usr/lib/firefox-2.0.0.4/components/libappcomps.so
      52 kb      32 kb        0 kb  /usr/lib/firefox-2.0.0.4/components/libcookie.so
      44 kb      32 kb        0 kb  /usr/lib/firefox-2.0.0.4/components/libpipboot.so
    100 kb      48 kb        0 kb  /usr/lib/firefox-2.0.0.4/libjsj.so
    812 kb      124 kb        0 kb  /usr/lib/firefox-2.0.0.4/components/libuconv.so
    424 kb      260 kb        0 kb  /usr/lib/firefox-2.0.0.4/components/libhtmlpars.so
      52 kb      20 kb        0 kb  /usr/lib/libgnome-keyring.so.0.0.1
    960 kb      296 kb        0 kb  /usr/lib/firefox-2.0.0.4/components/libeditor.so
      28 kb      20 kb        0 kb  /usr/lib/firefox-2.0.0.4/components/libtxmgr.so
    112 kb      60 kb        0 kb  /usr/share/fonts/liberation/LiberationSans-Regular.ttf
    144 kb      144 kb        0 kb  /usr/share/fonts/default/Type1/n021003l.pfb
    428 kb      20 kb        0 kb  /usr/share/fonts/dejavu-lgc/DejaVuLGCSans.ttf
    100 kb      100 kb        0 kb  /usr/share/fonts/default/Type1/n019003l.pfb
    408 kb      12 kb        0 kb  /usr/share/fonts/dejavu-lgc/DejaVuLGCSans-Bold.ttf
      60 kb      16 kb        0 kb  /usr/share/fonts/liberation/LiberationMono-Regular.ttf
      72 kb      28 kb        0 kb  /usr/share/fonts/liberation/LiberationSans-Italic.ttf
      68 kb      40 kb        0 kb  /usr/share/fonts/liberation/LiberationSans-Bold.ttf
      28 kb        4 kb        0 kb  /usr/lib/gconv/gconv-modules.cache
. . . . . 
. . . . . 
. . . . . 

SHARED MAPPINGS
    vmsize  rss clean  rss dirty  file
    1336 kb      660 kb        0 kb  /lib/libc-2.6.so
    1016 kb      524 kb        0 kb  /usr/lib/libX11.so.6.2.0
    384 kb        0 kb      384 kb  /SYSV00000000 (deleted)
    896 kb      360 kb        0 kb  /usr/lib/libstdc++.so.6.0.8
    536 kb      340 kb        0 kb  /usr/lib/libfreetype.so.6.3.15
    632 kb      336 kb        0 kb  /lib/libglib-2.0.so.0.1200.11
    248 kb      220 kb        0 kb  /lib/libgobject-2.0.so.0.1200.11
    504 kb      216 kb        0 kb  /usr/lib/libnss3.so
    384 kb        0 kb      192 kb  /SYSV00000000 (deleted)
    312 kb      188 kb        0 kb  /usr/lib/libORBit-2.so.0.1.0
    3676 kb      176 kb        0 kb  /usr/lib/libgtk-x11-2.0.so.0.1000.13
    212 kb      152 kb        0 kb  /usr/lib/libnspr4.so
    328 kb      148 kb        0 kb  /usr/lib/libsoftokn3.so
    156 kb      124 kb        0 kb  /usr/lib/libfontconfig.so.1.2.0
    204 kb      112 kb        0 kb  /usr/lib/libgconf-2.so.4.1.2
    108 kb      100 kb        0 kb  /lib/ld-2.6.so
    148 kb      100 kb        0 kb  /usr/lib/libpng12.so.0.16.0
    868 kb      92 kb        0 kb  /lib/libasound.so.2.0.0
    124 kb      88 kb        0 kb  /lib/libexpat.so.0.5.0
    1136 kb      84 kb        0 kb  /lib/libcrypto.so.0.9.8b
    428 kb      72 kb        0 kb  /usr/share/fonts/dejavu-lgc/DejaVuLGCSans.ttf
    552 kb      68 kb        0 kb  /usr/lib/libgdk-x11-2.0.so.0.1000.13
    572 kb      68 kb        0 kb  /usr/lib/libkrb5.so.3.3
      80 kb      64 kb        0 kb  /lib/libpthread-2.6.so
      64 kb      64 kb        0 kb  /var/cache/fontconfig/d066cc093611c74861a22d5ef60b042c-x86.ca
    232 kb      60 kb        0 kb  /usr/lib/libfreebl3.so
    408 kb      60 kb        0 kb  /usr/share/fonts/dejavu-lgc/DejaVuLGCSans-Bold.ttf
    2048 kb      52 kb        0 kb  /usr/lib/locale/locale-archive
    156 kb      48 kb        0 kb  /lib/libm-2.6.so
      72 kb      44 kb        0 kb  /lib/libz.so.1.2.3
    260 kb      44 kb        0 kb  /lib/libssl.so.0.9.8b
. . . . .
. . . . .
. . . . .



The starting four lines is enough to see how much memory is it actually using, The next details if useful, if you want to pin point which library or usually plugin lib, which is eating memory , and other analysis.

So just to get the Jist of process memory usage , do the following :

Code:

VMSIZE:    247496 kb
RSS:        104740 kb total
              6512 kb shared
            21956 kb private clean
            76272 kb private dirty




here u see that actually, over 90.5 MB ( that is 21956 kb private clean + 76272 kb private dirty ) Is used by firefox , as reserved private region, exclusively. and only over 6 mb is occupied by shared libs, used by many processes along with Firefox.

actually, Though this is a better solution, it is not ideal. See for example, All this shared libraries is used only by this process, or else just by 2 or 3 processes, than this one is not ideal.

Hope this is helpful.

Regards,

-- Chandan

[email protected]

If any queries etc, Reply to this Message by CLICKING HERE

你可能感兴趣的:(Linux)