スポンサーサイト

--年--月--日 --:--

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

NSD: Process Memory Mapping (Windowsのみ)

2010年03月09日 01:34

(今日のトピックはプラットフォームに依存していないトピックも多いのですが主にWindowsを想定して書いています。UNIXプラットフォームをイメージすると多少変に聞こえるところがあるかもしれませんのでその点はご了承下さい)

共有メモリとかプロセスヒープとかスタックとか色々な種類のメモリがNotesに限らずプロセス内には存在する事が分かっている方は多いと思いますが、どれもスコープが違うだけで、1つのプロセスでは同じ仮想アドレス空間内に配置されます。たとえば仮想アドレス空間内では、1番地から5番地は共有メモリ、10番地から20番地はプロセスヒープ、のようになっているはずです。

NSDでは共有メモリとか色々ややこしいのが出てきますが、共有メモリはあれを含めてこれを含めないとかプロセスヒープとかもスタックは含まないとか、二つを足してもDLLやexeをロードしている領域は含まれなかったり分かりにくいですよね。全体としてはどういう風に配置されているか知りたいときにはどうすればいいのでしょうか?

Sysinternalsではこのような利用状況を把握するためにVMMAP と言うツールが提供されていますが、NSDでは、Process Memory Mapping と言うセクションにこれと同様の機能が提供されています。


NSD のProcess memory mapping から共有メモリを見ると以下のように表示されています。
Notes SMem と表示されているセクションが、mapped と言うType指定をされている事に着目して下さい。

59 00b60000 00b60000 4.2M COMMIT mapped -Crw-- 0 Notes shared mem:MMM
60 00f9f000 00000000 4.0K FREE ------- -C---- 0
61 00fa0000 00fa0000 980.0K COMMIT mapped -Crw-- 0 Notes SMem[1]
(略)
64 01120000 01120000 256.0K COMMIT mapped -Crw-- 0 Notes SMem[2]
65 01160000 01160000 256.0K COMMIT mapped -Crw-- 0 Notes SMem[3]
66 011a0000 011a0000 256.0K COMMIT mapped -Crw-- 0 Notes SMem[4]
67 011e0000 011e0000 256.0K COMMIT mapped -Crw-- 0 Notes SMem[5]
68 01220000 01220000 256.0K COMMIT mapped -Crw-- 0 Notes SMem[6]
(略)
333 084e0000 084e0000 980.0K COMMIT mapped -Crw-- 0 Notes SMem[30]

NSD の Shared Memory ではこの様子が以下のように出力されています。

Shared Memory:
TYPE : Count SIZE ALLOC FREE FRAG OVERHEAD %used %free
S-DPOOL: 30 32350292 29901108 2418644 0 47216 92% 7%
Overall: 30 32350292 29901108 2418644 0 47216 92% 7%

ここを見るとnServer のアドレス空間には nServer のイメージもロードされています。

50 00400000 00400000 4.0K COMMIT image -Cr--- 0 nSERVER.EXE
51 00401000 00400000 20.0K COMMIT image -Cr-x- 0 nSERVER.EXE (.text)
52 00406000 00400000 8.0K COMMIT image -Cr--- 0 nSERVER.EXE (.rdata)
53 00408000 00400000 4.0K COMMIT image -Crw-- 0 nSERVER.EXE (.data)
54 00409000 00400000 4.0K COMMIT image -Crw-c 0 nSERVER.EXE
55 0040a000 00400000 8.0K COMMIT image -Crw-- 0 nSERVER.EXE
56 0040c000 00400000 12.0K COMMIT image -Cr--- 0 nSERVER.EXE (.rsrc)


各スレッドのスタックのサイズも分かります。

Idx BaseAddr AlocBase Size State Type Prot Desc
---- -------- -------- ------ ------- ------ ------ ---------------
302 06c30000 06c30000 764.0K RESERVE private -C---- 0 thread 0cf0 stack (reserved)
303 06cef000 06c30000 4.0K COMMIT private GCrw-- 0 thread 0cf0 stack (guard)
304 06cf0000 06c30000 256.0K COMMIT private -Crw-- 0 thread 0cf0 stack

guardと言う領域まで延びるとAccess Violationを起こすのは何となく分かるのではないでしょうか。

このセクションは実際にNotesがメモリをどう使っているのかが直感的に分かるので、個人的には解析と言うよりは、Windowsプロセスのメモリの使い方を勉強するのに非常によく役に立ちました。


メモリの使用状況が多いときなどにはこんなセクションを見なくても、Shared、ヒープ、スタックなどを見ていった方が統計的な情報が得られるのでこのような情報は必要ないこともあるのですが、使用状況を詳細に把握したいときにはこのような情報も有益になるので、始めは興味本位でもよいので少しずつ見てみてください。

尚、最近のNSDではAIXでも似たようなセクションが表示されるようになりましたが、基本的にはWindowsのみの機能だと思ってください。


コメント

    コメントの投稿

    (コメント編集・削除に必要)
    (管理者にだけ表示を許可する)

    トラックバック

    この記事のトラックバックURL
    http://hnagasim.blog8.fc2.com/tb.php/313-525f71c0
    この記事へのトラックバック


    最新記事


    上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。