ユーザメモリを調査する


メモリ上に存在している実行中プロセスは、pmap -x pid <CR>によってプロセスセグメントの一覧を表示することが出来ます。次に、pmapコマンド-xオプションの出力を解説します。pmapコマンド-xオプションで表示することのできない、直ちに終了してしまうプロセスは、プロセスアカウント情報からサイズを確認します。ただし、プロセスアカウント情報では、mallocで拡張されたヒープ領域は加算されません。

 

【横の項目】

(A) プロセスIDです。
(B) そのプロセスのプログラム名です。
(C) Address:セグメントの仮想(リニア)アドレスです。
(D) Kbytes:キロバイト単位の実際のサイズを示します。
(E) Resident:メモリに常駐しているサイズを示します。
(F) Shared:共用コード、又は共用データのサイズです。
(G) Private:プロセスのプライベート領域サイズです。
(H) Permissions:保護属性フラグです(/usr/include/sys/procfs.hヘッダーファイルの"Protection and attributes"で定義されています)。
(I) Mapped File:マップされているファイル名。pmapコマンド-xオプション実行時にDNLC上に名前があると表示されます。DNLC上に名前が無い場合は"dev: 32,603 ino: 138415"のように、ディスクのメジャー、マイナー番号とiノード番号が表示されます。 この"dev"表示が多い場合DNLC個数を増やすカーネルパラメタチューニングが必要です。


【縦の項目】

(J) 実行プログラムのテキスト(インストラクション部分)セグメントです。同じプログラムが多数実行されたとしても共用されます。同一名のプログラムでディレクトリ位置の違う場所(リンクされていないところ)から実行されている場合は別プログラムとなります。
(K) プログラムを実行するためのデータセグメントです。プロセス毎に別領域となります。
(L) プログラムがmallocで割当てた領域です。brkシステムコールも、heap領域を割当てます。
(M) 共有メモリID毎にサイズを計算します。仮想アドレスの先頭が"8"です。64ビットアーキテクチャのマシンではビット幅が増えて表示されます。
(N) Anonymous(名前無し)の意味で、共用コードの使用するプロセス単位のデータセグメントです。
(O) プログラムから呼び出された、共用コードのテキストセグメントです。他のプログラムもこの共用コードを使用することがあります。同一名の共用コードでディレクトリ位置の違う場所(リンクされていないところ)から実行されている場合は別共用コードとなります。
(P) ライブラリコールによって使用されるセグメントで、プロセス単位に割り当てられます。writeの保護属性を持っています。
(Q) スタックセグメントです。プロセスにただ一つ存在します。

 

# pmap -x 1028 <CR>

(A)
1028:
(B)
ora_ora900_XXX
(C)
Address
(D)
Kbytes
(E)
Resident
(F)
Shared
(G)
Private
(H)
Permissions
(I)
Mapped File
00010000 8288 6672 6600 72 read/exec oracle (J)
00836000 80 72 32 40 read/write/exec oracle (K)
0084A000 480 320 - 320 read/write/exec [ heap ] (L)
80000000 485008 485008 - 485008 read/write/exec/shared [ ism shmid=0x5aa0 ] (M)
EF560000 8 - - - read/write/exec [ anon ] (N)
EF570000 16 16 16 - read/exec libc_psr.so.1 (O)
EF580000 592 592 592 - read/exec libc.so.1 (O)
EF622000 32 32 8 24 read/write/exec libc.so.1 (P)
EF62A000 8 8 - 8 read/write/exec [ anon ] (N)
EF640000 16 16 16 - read/exec libmp.so.2 (O)
EF652000 8 8 8 - read/write/exec libmp.so.2 (P)
EF660000 24 24 24 - read/exec libaio.so.1 (O)
EF674000 8 8 8 - read/write/exec libaio.so.1 (P)
EF676000 8 8 - 8 read/write/exec [ anon ] (N)
EF680000 448 312 304 8 read/exec libnsl.so.1 (O)
EF6FE000 40 40 8 32 read/write/exec libnsl.so.1 (P)
EF708000 24 - - - read/write/exec [ anon ] (N)
EF720000 24 24 24 - read/exec libposix4.so.1 (O)
EF734000 8 8 8 - read/write/exec libposix4.so.1 (P)
EF750000 88 88 88 - read/exec libm.so.1 (O)
EF774000 8 8 8 - read/write/exec libm.so.1 (P)
EF780000 32 32 32 - read/exec libsocket.so.1 (O)
EF796000 8 8 8 - read/write/exec libsocket.so.1 (P)
EF798000 8 - - - read/write/exec [ anon ] (N)
EF7A0000 8 8 8 - read/exec libdl.so.1 (O)
EF7B0000 8 - - - read/write/exec [ anon ] (N)
EF7C0000 120 120 120 - read/exec ld.so.1 (O)
EF7EC000 8 8 8 - read/write/exec ld.so.1 (P)
EFFF8000 32 16 - 16 read/write/exec [ stack ] (Q)
-------- ------ ------ ------ ------
total Kb 495440 493456 7920 485536
この差が大きいと元々メモリタッチが少なかったか、または、多くのページがページアウトされたかのどちらかです(ワーキングセットと考えることも出来ます)。psコマンドはKbytesのtotal Kbを"SZ"、Residentのtotal Kbを"RSS"として表示します。
#

【備考】値の単位は1024バイト(1キロバイト)です。

Copyright (C) 2004 by The Art of Computer Technologies, Corp.  All rights reserved.