プロセスのメモリマップについて (Linux)


  1. メモリマップとは?
  2. oracle のメモリマップ
  3. /proc のプロセスごとの項目

メモリマップとは?

Linux では /proc というディレクトリがあります。 これは Linux 上で現在動いているプロセスのための擬似ディレクトリです。

この直下にある数字から成るディレクトリは PID (Process IDentifier) に対応するもので、カーネルにあるプロセス制御テーブルをマップしたものです。 従って、このサイズはディスク上のものではありません。

また、これらの擬似ファイルはカーネルの管理下にありますので、 削除できません。 プロセスが終了すると、/proc 配下からもなくなります。




oracle のメモリマップ

まず、見たいプロセスの PID を求めます。

ora_dbw0_ora817 のメモリマップを見ることにします。

> ps -ef | grep ora817 | grep -v grep
20:ora817     773     1  0 Jun25 ?        00:00:00 ora_pmon_ora817
21:ora817     775     1  0 Jun25 ?        00:00:00 ora_dbw0_ora817
22:ora817     777     1  0 Jun25 ?        00:00:00 ora_lgwr_ora817
23:ora817     779     1  0 Jun25 ?        00:02:22 ora_ckpt_ora817
24:ora817     781     1  0 Jun25 ?        00:03:02 ora_smon_ora817
25:ora817     783     1  0 Jun25 ?        00:00:00 ora_reco_ora817
26:ora817     821     1  0 Jun25 ?        00:00:00 /home1/ora817/product/8.1.7/bin/
65:root     19268 19267  0 13:52 pts/5    00:00:00 login -- ora817
67:root     19270 19269  0 13:52 pts/6    00:00:00 login -- ora817
68:ora817   19271 19270  0 13:52 pts/6    00:00:00 -tcsh
69:ora817   19306 19268  0 13:53 pts/5    00:00:00 -tcsh

プロセスのメモリマップは /proc/PID の下の maps にあります。

> cd /proc/775
>ls -l
合計 24832
dr-xr-xr-x    3 ora817   oinstall        0 10月  4 14:13 ./
dr-xr-xr-x   86 root     root            0  6月 25 23:33 ../
-r--r--r--    1 ora817   oinstall        0 10月  4 14:13 cmdline
drwxr-xr-x    2 ora817   oinstall     4096  9月  9 17:17 cwd/
-r--------    1 ora817   oinstall        0 10月  4 14:13 environ
-rwsr-s--x    1 ora817   oinstall 25385665  6月  7  2002 exe*
dr-x------    2 ora817   oinstall        0 10月  4 14:13 fd/
-r--r--r--    1 ora817   oinstall        0 10月  4 14:13 maps
-rw-------    1 ora817   oinstall        0 10月  4 14:13 mem
drwxr-xr-x   23 root     root         4096  5月 14  2003 root/
-r--r--r--    1 ora817   oinstall        0 10月  4 14:13 stat
-r--r--r--    1 ora817   oinstall        0 10月  4 14:13 statm
-r--r--r--    1 ora817   oinstall        0 10月  4 14:13 status

では、PID 775 の ora_dbw0_ora817 のメモリマップを見てみましょう。

> cat maps
08048000-09682000 r-xp 00000000 08:02 208453     /home1/ora817/product/8.1.7/bin/oracle      テキスト 
09682000-096b0000 rw-p 01639000 08:02 208453     /home1/ora817/product/8.1.7/bin/oracle      データ 
096b0000-096de000 rwxp 00000000 00:00 0
40000000-40014000 r-xp 00000000 08:01 80615      /lib/ld-2.2.3.so
40014000-40015000 rw-p 00013000 08:01 80615      /lib/ld-2.2.3.so
40015000-40016000 rwxp 00000000 00:00 0
40016000-40379000 r-xp 00000000 08:02 165988     /home1/ora817/product/8.1.7/lib/libjox8.so
40379000-40397000 rw-p 00362000 08:02 165988     /home1/ora817/product/8.1.7/lib/libjox8.so
40397000-40399000 rw-p 00000000 00:00 0
40399000-403a0000 r-xp 00000000 08:02 166017     /home1/ora817/product/8.1.7/lib/libdsbtsh8.so
403a0000-403a1000 rw-p 00006000 08:02 166017     /home1/ora817/product/8.1.7/lib/libdsbtsh8.so
403a1000-403a2000 rw-p 00000000 00:00 0
403a2000-403a4000 r-xp 00000000 08:01 80628      /lib/libdl-2.2.3.so
403a4000-403a5000 rw-p 00001000 08:01 80628      /lib/libdl-2.2.3.so
403a5000-403a6000 rw-p 00000000 00:00 0
403a6000-403c8000 r-xp 00000000 08:01 80630      /lib/libm-2.2.3.so
403c8000-403c9000 rw-p 00021000 08:01 80630      /lib/libm-2.2.3.so
403c9000-403d7000 r-xp 00000000 08:01 80660      /lib/libpthread-0.9.so
403d7000-403df000 rw-p 0000d000 08:01 80660      /lib/libpthread-0.9.so
403df000-404fd000 r-xp 00000000 08:01 80624      /lib/libc-2.2.3.so
404fd000-40503000 rw-p 0011d000 08:01 80624      /lib/libc-2.2.3.so
40503000-40507000 rw-p 00000000 00:00 0
40507000-40510000 r-xp 00000000 08:01 80649      /lib/libnss_files-2.2.3.so
40510000-40511000 rw-p 00008000 08:01 80649      /lib/libnss_files-2.2.3.so
50000000-5186e000 rw-s 00000000 00:03 32769      /SYSVf49c4910 (deleted)      SGA
bfffc000-c0000000 rwxp ffffd000 00:00 0                                       STACK

上記マップの説明は以下のとおりです。

  1. 08048000-09682000 が oracle プロセスのテキストセグメントです。
  2. 09682000-096b0000 が oracle プロセスのデータセグメントです。
  3. 096b0000-096de000 が oracle プロセスの BSS (Block Started by Symbol) です。
  4. 40000000 が mapped_base です。
  5. 50000000-5186e000 が SGA です。
  6. c0000000 より低いアドレスは stack です(通常 8MB)。
    ksh の ulimit -a で得られる stack のサイズに依存します。
  7. c0000000 以降は Linux kernel が使用します。




/proc のプロセスごとの項目

/proc/PID の下には、以下のサブディレクトリがあります。

ファイル 内容
cmdline コマンドライン引き数
environ 環境変数の値
fd 全てのファイルディスクリプタを含んだディレクトリ
mem このプロセスが保持しているメモリ
stat プロセスの状態
status 人間が読める形式のプロセスの状態
cwd プロセスの現在の作業ディレクトリへのリンク
exe このプロセスの実行形式へのリンク
maps メモリ・マップ
root このプロセスのルート・ディレクトリへのリンク
statm プロセスのメモリ状態についての情報

status

プロセスの状態についての情報を得るには /proc/PID/status というファイルを読むだけで可能です。

> cat status
Name:   oracle
State:  S (sleeping)
Pid:    775
PPid:   1
TracerPid:      0
Uid:    501     501     501     501
Gid:    201     201     201     201
FDSize: 1024
Groups: 201 10 200
VmSize:    53348 kB
VmLck:         0 kB
VmRSS:       888 kB
VmData:      220 kB
VmStk:        16 kB
VmExe:     22760 kB
VmLib:      4956 kB
SigPnd: 0000000000000000
SigBlk: 0000000080000000
SigIgn: 8000000006005203
SigCgt: 0000000389802cfc
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000


> ps -eo user,pid,nice,state,start_time,time,pcpu,dsiz,sz,rss,args | grep 775|grep -v grep
USER       PID  NI S START     TIME %CPU DSIZ    SZ  RSS COMMAND
ora817     775   0 S Jun25 00:00:00  0.0 30588 13337 888 ora_dbw0_ora817

これは ps コマンドによって見ることができるのとほとんど同じ情報を示しています。 実際 ps はこの情報を proc ファイルシステムから取得しています。

statm

statm ファイルにはプロセスの使用メモリについてのより詳しい情報があります。 その七つの値の意味は以下で説明します。

ファイル 内容
size プログラムの合計サイズ:ページ数
resident メモリ上にある部分のサイズ:ページ数
shared 共有されているページ数
trs コードのページ数
drs データ/スタックのページ数
lrs ライブラリのページ数
dt 汚れた(dirty)ページ数

> cat statm
306 222 222 87 0 135 82