pmap でプロセスのメモリマッピングについて調べる
pmap というコマンドの使い方を覚えたので忘れないうちにメモ.
pmap は指定したプロセスのメモリマッピングに関する情報を proc ファイルシステムから取得し,表示してくれるツールです.例えば,bash プロセスのメモリマッピングがどんな風になっているか,次のように調べることができます.
$ ps | grep bash
27723 pts/0 00:00:00 bash
$ pmap 27723
27723: bash
0000000000400000 896K r-x-- /bin/bash
00000000006e0000 4K r---- /bin/bash
00000000006e1000 36K rw--- /bin/bash
00000000006ea000 24K rw--- [ anon ]
0000000000dde000 4356K rw--- [ anon ]
00007ffc73ad5000 48K r-x-- /lib/x86_64-linux-gnu/libnss_files-2.15.so
00007ffc73ae1000 2044K ----- /lib/x86_64-linux-gnu/libnss_files-2.15.so
00007ffc73ce0000 4K r---- /lib/x86_64-linux-gnu/libnss_files-2.15.so
00007ffc73ce1000 4K rw--- /lib/x86_64-linux-gnu/libnss_files-2.15.so
00007ffc73ce2000 13884K r---- /usr/lib/locale/locale-archive
00007ffc74a71000 1748K r-x-- /lib/x86_64-linux-gnu/libc-2.15.so
00007ffc74c26000 2048K ----- /lib/x86_64-linux-gnu/libc-2.15.so
00007ffc74e26000 16K r---- /lib/x86_64-linux-gnu/libc-2.15.so
00007ffc74e2a000 8K rw--- /lib/x86_64-linux-gnu/libc-2.15.so
00007ffc74e2c000 20K rw--- [ anon ]
00007ffc74e31000 8K r-x-- /lib/x86_64-linux-gnu/libdl-2.15.so
00007ffc74e33000 2048K ----- /lib/x86_64-linux-gnu/libdl-2.15.so
00007ffc75033000 4K r---- /lib/x86_64-linux-gnu/libdl-2.15.so
00007ffc75034000 4K rw--- /lib/x86_64-linux-gnu/libdl-2.15.so
00007ffc75035000 136K r-x-- /lib/x86_64-linux-gnu/libtinfo.so.5.9
00007ffc75057000 2048K ----- /lib/x86_64-linux-gnu/libtinfo.so.5.9
00007ffc75257000 16K r---- /lib/x86_64-linux-gnu/libtinfo.so.5.9
00007ffc7525b000 4K rw--- /lib/x86_64-linux-gnu/libtinfo.so.5.9
00007ffc7525c000 136K r-x-- /lib/x86_64-linux-gnu/ld-2.15.so
00007ffc7545a000 12K rw--- [ anon ]
00007ffc75475000 28K r--s- /usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache
00007ffc7547c000 8K rw--- [ anon ]
00007ffc7547e000 4K r---- /lib/x86_64-linux-gnu/ld-2.15.so
00007ffc7547f000 8K rw--- /lib/x86_64-linux-gnu/ld-2.15.so
00007fffa9298000 132K rw--- [ stack ]
00007fffa92c1000 8K r-x-- [ anon ]
ffffffffff600000 4K r-x-- [ anon ]
total 29748K
左から,仮想アドレス,仮想マッピングサイズ,アクセス権,マッピング名を意味しています.マッピング名のうち,anon は名前付きオブジェクトやファイルに関連付いていないメモリ,もしくはマッピング名が分からないものに対して表示されます.stack はメインスタックです.
-x オプションを追加すると,RSS (Resident Set Size) や Dirty page に関する情報も得られます.
$ pmap -x 27723
27723: bash
Address Kbytes RSS Dirty Mode Mapping
0000000000400000 0 652 0 r-x-- bash
00000000006e0000 0 4 4 r---- bash
00000000006e1000 0 36 36 rw--- bash
00000000006ea000 0 24 24 rw--- [ anon ]
0000000000dde000 0 4352 4352 rw--- [ anon ]
00007ffc73ad5000 0 16 0 r-x-- libnss_files-2.15.so
00007ffc73ae1000 0 0 0 ----- libnss_files-2.15.so
00007ffc73ce0000 0 4 4 r---- libnss_files-2.15.so
00007ffc73ce1000 0 4 4 rw--- libnss_files-2.15.so
00007ffc73ce2000 0 52 0 r---- locale-archive
00007ffc74a71000 0 664 0 r-x-- libc-2.15.so
00007ffc74c26000 0 0 0 ----- libc-2.15.so
00007ffc74e26000 0 16 16 r---- libc-2.15.so
00007ffc74e2a000 0 8 8 rw--- libc-2.15.so
00007ffc74e2c000 0 20 20 rw--- [ anon ]
00007ffc74e31000 0 8 0 r-x-- libdl-2.15.so
00007ffc74e33000 0 0 0 ----- libdl-2.15.so
00007ffc75033000 0 4 4 r---- libdl-2.15.so
00007ffc75034000 0 4 4 rw--- libdl-2.15.so
00007ffc75035000 0 116 0 r-x-- libtinfo.so.5.9
00007ffc75057000 0 0 0 ----- libtinfo.so.5.9
00007ffc75257000 0 16 16 r---- libtinfo.so.5.9
00007ffc7525b000 0 4 4 rw--- libtinfo.so.5.9
00007ffc7525c000 0 112 0 r-x-- ld-2.15.so
00007ffc7545a000 0 12 12 rw--- [ anon ]
00007ffc75475000 0 24 0 r--s- gconv-modules.cache
00007ffc7547c000 0 8 8 rw--- [ anon ]
00007ffc7547e000 0 4 4 r---- ld-2.15.so
00007ffc7547f000 0 8 8 rw--- ld-2.15.so
00007fffa9298000 0 48 48 rw--- [ stack ]
00007fffa92c1000 0 4 0 r-x-- [ anon ]
ffffffffff600000 0 0 0 r-x-- [ anon ]
---------------- ------ ------ ------
total kB 29776 6224 4576
pmap は,ps や top といったコマンドと一緒に Procps (The /proc file system utilities) と呼ばれるユーティリティに含まれています.