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


  1. メモリマップとは?
  2. oracle のメモリマップ (svmon)
  3. oracle のメモリマップ (procmap)
  4. メモリリークを調べる
  5. /proc を管理するコマンド

メモリマップとは?

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

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

また、これらの擬似ファイルはカーネルの管理下にありますので、 削除できません。

このページでは AIX 5.2 Lで実行した結果を載せています。 ただし、svmon コマンドは 4.3 でも利用可能です。

> df -k
Filesystem    1024-blocks      Free %Used    Iused %Iused Mounted on
/dev/hd4            65536     51792   21%     2044    15% /
/dev/hd2          5046272   2038808   60%    33395     7% /usr
/dev/hd9var        655360     79964   88%      797     5% /var
/dev/hd3          1310720   1164276   12%      974     1% /tmp
/dev/hd1         18087936   3893156   79%   174209    16% /home
/proc                   -         -    -         -     -  /proc
/dev/hd10opt        65536     14196   79%     1544    32% /opt
/dev/lv00         5242880    589632   89%     5914     1% /media

プロセスが終了すると、/proc 配下からもなくなります。

PID を指定してこれらの情報を操作するツールがいくつかあります。
それらは、/bin/* にあり /proc を管理するコマンドで詳細を述べます。

なお、/proc の構造体は /usr/include/procfs.h に定義されています。




oracle のメモリマップ (svmon)

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

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

> ps -ef | grep ast9203 | grep -v grep
 ast9203  286974       1   0   Oct 18      -  0:15 ora_lgwr_ast9203
 ast9203  397442 2150468   0 08:49:12  pts/1  0:00 -csh
 ast9203  409608       1   0   Oct 18      -  0:00 ora_reco_ast9203
 ast9203  528446       1   0   Oct 18      -  0:23 ora_dbw0_ast9203
 ast9203  782450       1   0   Oct 18      -  0:52 ora_pmon_ast9203
 ast9203  790714       1   0   Oct 18      -  0:27 ora_smon_ast9203
 ast9203  864418       1   0   Oct 18      -  1:30 ora_ckpt_ast9203
 ast9203 1720492  397442   0 08:49:59  pts/1  0:00 vi mal_tst.c
 ast9203 2150468 2433080   0 08:47:17  pts/1  0:00 -ksh
 ast9203 2179196 2564204   0 09:16:04  pts/3  0:00 mal_tst 1
 ast9203 2289678 1351776   0 08:48:15  pts/6  0:00 -ksh
 ast9203 2551932 3039456   2 09:44:20  pts/6  0:00 ps -ef
 ast9203 2564204 3076176   0 08:49:01  pts/3  0:00 -csh
 ast9203 2633922 2138338   0 08:50:36  pts/8  0:00 -ksh
 ast9203 3039456 2289678   8 08:48:42  pts/6  0:00 -csh
 ast9203 3076176  958614   0 08:48:14  pts/3  0:00 -ksh
 ast9203 3088604 2633922   0 08:50:48  pts/8  0:00 -csh

以下のコマンドで、そのプロセスのメモリマップを得られます。

# svmon -P PID 

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

セグメントは、いくつかのページが集められたもので、 メモリー使用量の報告に使用される基本のオブジェクトです。 svmon によって報告される統計情報は、ページ単位に表示されます。 ページは、1 つが 4K の仮想メモリー・ブロックです。 これに対して、フレームは 4K の実メモリー・ブロックです。 特に注釈のない限り、統計情報はすべて 4096 バイトのメモリー・ページです。

メモリーの使用量は、inuse、free、pin、virtual、および paging space カウンターを使って報告されます。

  1. inuse は、使用されるフレーム数を示します。
  2. free は、全メモリー・プール中の空きフレーム数を示します。
  3. pin は、ピン・フレーム、つまりスワップできないフレーム数を示します。
  4. virtual は、システムの仮想スペースに割り当てられているページ数を示します。
  5. paging space は、予約されている、 またはページング・スペースで使用されているページ数を示します。

# svmon -P 528446

-------------------------------------------------------------------------------
     Pid Command          Inuse      Pin     Pgsp  Virtual 64-bit Mthrd LPage
  528446 oracle           17415     3000    19047    31168      Y     N     N

    Vsid      Esid Type Description              LPage  Inuse   Pin Pgsp Virtual
   5ce38  70000000 work default shmat/mmap           -   4962     0 14534 16068       SGA 
       0         0 work kernel segment               -   4539  2978 2009  6793
   349ad  90000000 work loader segment               -   3595     0   49  5741
   4e53a        10 clnt text data BSS heap,          -   3546     0    -     -
                        /dev/fslv00:4702
   10dcb  70000001 work default shmat/mmap           -    506     0  583   583        SGA 
   65199  90020014 work shared library text          -    126     0  461   471
   5ce78        11 work text data BSS heap           -     75     0 1102  1134
   7ced0 f00000002 work process private              -     27    22    5    30
   409f0  9ffffffe work other kernel segments        -     17     0   10    23
   41190  9fffffff clnt shared library text,         -      9     0    -     -
                        /dev/hd2:2053
    8ecd  9001000a work shared library text          -      6     0   83   110
   54eba  ffffffff work application stack            -      5     0    9    12
   46394         - clnt /dev/fslv00:28710            -      1     0    -     -
    4ece  8001000a work private load                 -      1     0   89    90
   30923         - clnt /dev/fslv00:266933           -      0     0    -     -
   3c900         - clnt /dev/fslv00:266929           -      0     0    -     -
   7df52         - clnt /dev/fslv00:266917           -      0     0    -     -
    cdec  80020014 work private load                 -      0     0  103   103
   64716  fffffff6 work application stack            -      0     0    0     0
   1ce08  fffffff0 work application stack            -      0     0    0     0
   3e7a2         - clnt /dev/fslv00:266919           -      0     0    -     -
   3a7a3         - clnt /dev/fslv00:217126           -      0     0    -     -
   1068b  fffffffa work application stack            -      0     0    0     0
   4e59e         - clnt /dev/fslv00:266925           -      0     0    -     -
   14e8a  fffffffc work application stack            -      0     0    0     0
     8ef         - clnt /dev/fslv00:266931           -      0     0    -     -
   32401         - clnt /dev/fslv00:266924           -      0     0    -     -
    88cd         - clnt /dev/fslv00:266928           -      0     0    -     -
   7b690         - clnt /dev/fslv00:266927           -      0     0    -     -
   4cebc  fffffffd work application stack            -      0     0    0     0
   136aa         - clnt /dev/fslv00:223272           -      0     0    -     -
   18ea9  fffffff2 work application stack            -      0     0    0     0
   1cea8  fffffffe work application stack            -      0     0    0     0
   267a4         - clnt /dev/fslv00:266918           -      0     0    -     -
   1cec8  fffffff1 work application stack            -      0     0    0     0
   166e8         - clnt /dev/fslv00:266923           -      0     0    -     -
   24ec6  fffffff3 work application stack            -      0     0    0     0
    474e         - clnt /dev/fslv00:266932           -      0     0    -     -
   44e5e  fffffff4 work application stack            -      0     0    0     0
   2cec4  fffffff5 work application stack            -      0     0    0     0
   34ec2  fffffff7 work application stack            -      0     0    0     0
   2cee4  8fffffff work private load                 -      0     0   10    10
   4c6fc  fffffff8 work application stack            -      0     0    0     0
   3cec0  fffffff9 work application stack            -      0     0    0     0
   44ebe  fffffffb work application stack            -      0     0    0     0
   5f7d3         - clnt /dev/fslv00:266930           -      0     0    -     -

上記の出力項目のプロセス・レポートのカラム見出しについて説明します。

項目名説          明
Pid プロセス ID
Command 実行中のコマンド
Inuse セグメントの実メモリー内のページの総数
Pin セグメントのピン・ページの総数
Pgsp ページング・スペース上に予約あるいは使用されているページの総数
Virtual 仮想スペースに割り当てられたページの総数
64-bit 64 ビット・プロセス (Y) か 32 ビット・プロセス (N)
Mthrd マルチスレッドである (Y) かそうでないか (N)
LPage 大規模ページ・ステータスかどうかを示します。 「M」は必須を意味します。
「Y」はプロセスが大規模ページ・セグメントを使用するか、 すでに使用したことを意味し、
「N」はプロセスが大規模ページを 使用しないことを意味します。

プロセスのメモリは、テキスト・セグメント、データ・セグメント、 スタック・セグメントに分類されます。
ここでセグメントとは、 連続したメモリ領域のことで、ページ単位で管理されます。

上記例では、SGA の一部はページング・スペースに swapout されています。
14534 + 583 = 15117 (pages)

init.ora には LOCK_SGA=true が設定してありますので、 AIX 5.2 L では LOCK_SGA は有効にならないことがわかります。

また svmon の出力のセグメントの Type は以下のとおりです。

Type 説明
pers 永続セグメントを表します
work 作業セグメントを表します
clnt クライアント・セグメントを表します
map マップされたセグメントを表します
rmap 実メモリ・マッピング・セグメントを表します

上記プロセスの ps の結果は以下のようです。 svmon と ps の結果との関係はつぎのとおりです。 単位は svmon は page(=4KB)、ps は KB です。

  1. ps の RSS = 4 * Inuse of (work lib data + work private + pers/clnt code)
  2. ps の SIZE = 4 * Virtual of (work lib data + work private)
  3. ps の TRS = 4 * Inuse of (pers/clnt code)

> ps egv|grep 528446|grep -v grep
    PID    TTY STAT  TIME PGIN  SIZE   RSS   LIM  TSIZ   TRS %CPU %MEM COMMAND
 528446      - A     0:23  160  5956 14640    xx 45225 14184  0.0  0.0 ora_dbw

> ps gu|grep 528446|grep -v grep
USER         PID %CPU %MEM   SZ  RSS    TTY STAT    STIME  TIME COMMAND
ast9203   528446  0.0  0.0 51180 14644    - A      Oct 18  0:23 ora_dbw0_ast9203


[ ps コマンド出力の詳細 ]
RSS  (v フラグ) プロセスの実メモリー (常駐セット) のサイズ (1 キロバイト単位)。
                この値はプロセスが所有するプライベート・セグメント・ページ数
                および共有ライブラリデータ・セグメント・ページ数および
                コード・セグメント・ページ数を加えたものに4をかけた値
                (1ページ4Kバイト)と同じです。
                なお、コード・セグメント・ページはシステム内において他の
                プロセスと共有して使用されます。
SIZE (v フラグ) プロセスのデータ・セクションの仮想サイズ (1 キロバイト単位)。
TRS  (v フラグ) テキストの常駐セット (実メモリー) のサイズ。 
TSIZ (v フラグ) テキスト (共用プログラム) イメージのサイズ。
SZ   (-l および l フラグ) プロセスのコア・イメージの 1 キロバイト単位のサイズ。 
VSZ             仮想メモリーでのプロセスのサイズを、キロバイト単位の 10 進整数
                で示します。このフィールドのデフォルト・ヘッダーは VSZ です。 




oracle のメモリマップ (procmap)

# procmap 528446
528446 : ora_dbw0_ast9203
      100000000     49031K  read/exec         oracle       テキスト 
      1100003f8      2017K  read/write        oracle       データ
9fffffff0000000        31K  read/exec         /usr/ccs/bin/usla64
9fffffff0007f3f         0K  read/write        /usr/ccs/bin/usla64
90000000028f000         3K  read/exec         /home11/ast9203/app/oracle/product/9.2.0/lib/libodm9.so
9001000a01a3738         0K  read/write        /home11/ast9203/app/oracle/product/9.2.0/lib/libodm9.so
90000000053fb20       240K  read/exec         /usr/lib/liblvm.a
9001000a01618f0        24K  read/write        /usr/lib/liblvm.a
90000000052dac0        65K  read/exec         /usr/lib/libcfg.a
9001000a015a488        24K  read/write        /usr/lib/libcfg.a
9000000004d99e0        55K  read/exec         /usr/lib/libperfstat.a
9001000a0157418         7K  read/write        /usr/lib/libperfstat.a
9000000004d7220         3K  read/exec         /usr/lib/libc.a
9001000a0156c00         0K  read/write        /usr/lib/libc.a
9000000004c2340        82K  read/exec         /usr/lib/libodm.a
9001000a014c500        35K  read/write        /usr/lib/libodm.a
9000000004c1000         0K  read/exec         /usr/lib/libdl.a
9001000a014b000         0K  read/write        /usr/lib/libdl.a
90000000174f100      4911K  read/exec         /home11/ast9203/app/oracle/product/9.2.0/lib/libjox9.a
8001000a0000f70       363K  read/write        /home11/ast9203/app/oracle/product/9.2.0/lib/libjox9.a
900000000494000       178K  read/exec         /usr/lib/libpthreads.a
9001000a00bf000       556K  read/write        /usr/lib/libpthreads.a
900000000248280         2K  read/exec         /usr/lib/libcrypt.a
9001000a00be760         0K  read/write        /usr/lib/libcrypt.a
900000000024240      2189K  read/exec         /usr/lib/libc.a
9001000a0000b20       756K  read/write        /usr/lib/libc.a
        Total       60584K




メモリリークを調べる

メモリリークを調べるプログラム mal_tst を使ったテスト結果を示します。 このプログラムは、40KB づつメモリを確保、初期化します。 以下の結果は、3回連続して実行した結果です。

ps コマンドの結果も SZ,RSS ともに 40 づつ増加しています。
また svmon の結果では work process private が 10 pages(1page=4KB) づつ増加しています。

> ps gu|grep 2551886|grep -v grep
USER         PID %CPU %MEM   SZ  RSS    TTY STAT    STIME  TIME COMMAND
ast9203  2551886  0.0  0.0  212  448  pts/3 A    10:30:09  0:00 mal_tst 1
ast9203  2551886  0.0  0.0  252  488  pts/3 A    10:30:09  0:00 mal_tst 1
ast9203  2551886  0.0  0.0  292  528  pts/3 A    10:30:09  0:00 mal_tst 1

> ps egv|grep 2551886|grep -v grep
    PID    TTY STAT  TIME PGIN  SIZE   RSS   LIM  TSIZ   TRS %CPU %MEM COMMAND
2551886  pts/3 A     0:00    0   180   448    xx    34   268  0.0  0.0 mal_tst 1
2551886  pts/3 A     0:00    0   220   488    xx    34   268  0.0  0.0 mal_tst 1
2551886  pts/3 A     0:00    0   260   528    xx    34   268  0.0  0.0 mal_tst 1

#  svmon -P 2551886

-------------------------------------------------------------------------------
     Pid Command          Inuse      Pin     Pgsp  Virtual 64-bit Mthrd LPage
 2551886 mal_tst           9275     4964     2109    19276      N     N     N

    Vsid      Esid Type Description              LPage  Inuse   Pin Pgsp Virtual
   289aa         d work loader segment               -   4624  1983  100 12438
       0         0 work kernel segment               -   4539  2978 2009  6793
   77df2         1 clnt code,/dev/fslv00:286722      -     67     0    -     -
   394a1         2 work process private              -     30     3    0    30
   66716         f work shared library data          -     15     0    0    15

# svmon -P 2551886

-------------------------------------------------------------------------------
     Pid Command          Inuse      Pin     Pgsp  Virtual 64-bit Mthrd LPage
 2551886 mal_tst           9285     4964     2109    19286      N     N     N

    Vsid      Esid Type Description              LPage  Inuse   Pin Pgsp Virtual
   289aa         d work loader segment               -   4624  1983  100 12438
       0         0 work kernel segment               -   4539  2978 2009  6793
   77df2         1 clnt code,/dev/fslv00:286722      -     67     0    -     -
   394a1         2 work process private              -     40     3    0    40
   66716         f work shared library data          -     15     0    0    15

# svmon -P 2551886

-------------------------------------------------------------------------------
     Pid Command          Inuse      Pin     Pgsp  Virtual 64-bit Mthrd LPage
 2551886 mal_tst           9295     4964     2109    19296      N     N     N

    Vsid      Esid Type Description              LPage  Inuse   Pin Pgsp Virtual
   289aa         d work loader segment               -   4624  1983  100 12438
       0         0 work kernel segment               -   4539  2978 2009  6793
   77df2         1 clnt code,/dev/fslv00:286722      -     67     0    -     -
   394a1         2 work process private              -     50     3    0    50
   66716         f work shared library data          -     15     0    0    15

# procmap 2551886
2551886 : mal_tst 1
10000000          52K  read/exec         mal_tst
200006d0          10K  read/write        mal_tst
d007a0f8           2K  read/exec         /usr/lib/libcrypt.a
f02b1508           0K  read/write        /usr/lib/libcrypt.a
d01dfe00        2016K  read/exec         /usr/lib/libc.a
f021ac30         597K  read/write        /usr/lib/libc.a
   Total        2679K




/proc を管理するコマンド

/proc ファイル・システムは、プロセスを制御するメカニズムを提供します。 また、プロセスとスレッドの現行状態についての情報もアクセスできますが、 これはバイナリー形式です。

コマンドが /proc から収集した情報は、 プロセスの現行状態のスナップショットであり、したがって停止したプロセス以外は、 刻々と変化します。

proctools コマンドは、いくつかの使用できる情報に基づいてレポートを提供します。 ツールの詳細は、以下のとおりです。

コマンド 概     要
proccred プロセスのクリデンシャル (有効、実、保管のユーザー ID とグループ ID) を印刷します。
procfiles プロセスがオープンしたすべてのファイル・ディスクリプターの情報をレポート します。 -n オプションを使用すると、対応するファイル名も表示します。
procflags 指定されたプロセスの各スレッドについて、 /proc トレース・フラグ、保留シグナルと保持シグナル、およびその他の /proc 状況情報を印刷します。オプション -r を使用すると、 マシン・レジスターの内容が印刷され、プロセスは該当のイベントで停止されます。 該当のイベントは、 で定義された、 PR_REQUESTED、PR_FAULTED、PR_SYSENTRY、および PR_SYSEXIT です。
procldd プロセスによりロードされた動的ライブラリーを、 dlopen() を使用して明示的に接続された共用オブジェクトも含めて、リストします。 必要な情報はすべて、 /proc/ProcessID/map ファイルから収集されます。
procmap プロセスのアドレス・スペース・マップを印刷します。 これは、プロセス内のそれぞれのマップされたセグメントの、 開始アドレスとサイズを表示します。 必要な情報はすべて、 /proc/ProcessID/map ファイルから収集されます。
procrun PR_REQUESTED イベントで停止したプロセスを開始します
procsig プロセスで定義されたシグナル・アクションをリストします
procstack プロセス内のすべてのスレッドについて 16 進アドレスとシンボル名を印刷しま す
procstop R_REQUESTED イベントでプロセスを停止します
proctree 指定されたプロセス ID またはユーザーを含むプロセス・ツリーを印刷します。 子プロセスは、その親プロセスの下に字下げされます。 すべて数字の引数はプロセス ID と見なされ、 それ以外はユーザー・ログイン名と見なされます。 デフォルトのアクションは、プロセス 0 の子以外のすべてのプロセスをレポートします 。
procwait 指定したすべてのプロセスが終了するのを待ちます
procwdx プロセスの現在の作業ディレクトリーを印刷します

関連項目

svmon,proccred,procfiles,procflags,procldd,procmap,procrun,procsig,procstack, procstop,proctree,procwait,procwdx

マニュアル参照

AIX 日本語マニュアル 5L
  1. 「パフォーマンス・マネージメント・ガイド」メモリー使用量
  2. svmon