[Windows] PDC10でのメモリ管理に関する講演の記録

PDC10での講演をMicrosoftの人がmsdn blogにアップしていた。sysinternalsのMark Russinovichがしゃべっているので自分のツールを活用したデモもあったようだ。

PDC10: Mysteries of Windows Memory Management Revealed: Part One
http://blogs.msdn.com/b/tims/archive/2010/10/28/pdc10-mysteries-of-windows-memory-management-revealed-part-one.aspx

PDC10: Mysteries of Windows Memory Management Revealed: Part Two
http://blogs.msdn.com/b/tims/archive/2010/10/29/pdc10-mysteries-of-windows-memory-management-revealed-part-two.aspx

task managerやリソースモニタを見て、おおよそどの程度かを判断する程度で数値の意味がいまいちわかっていなかった。特にcommitって何?ということなど、ほかのOSにはない概念だとわかりにくい。

以下、読みながらメモ。

Windowsのページは4KB。ページを大きくすることはできる。

32bitでは4GBのメモリ空間をもっている。ユーザ、システムに半分ずつ。(PAE-enabledなシステムだと3GBをユーザに割り当てることができる)
2GBのメモリが全プロセスのアドレスにマップされている。

64bitでは理論上は16EBのメモリ空間を持つが、今は16TB (2^44)までがサポートされ、ユーザ、システムで半分ずつ。

Virtual memoryを3つに分けると:

  1. private virtual memory — process heapなど共有しない
  2.  shareable — メモリマップされたファイル、共有すると明示的に指定した空間
  3.   free — まだ用途を指定してないメモリ

1と2はreserved(プロセスは使う予定ではあるけどまだ使用可能 availableにしていない)とcommited(使用可能)のどちらかのフラグを立てることができる。
reserveは、必要になったら連続領域を割り当てる。スタックなどがそれ。スタックを伸ばすときにreserved領域をcommitする。

task managerはcommit sizeを表示する。
ほとんどのリークはprivate commitメモリで発生する。
share されないshareableはわからない。

フラグメンテーションでもメモリ枯渇が早まる。

System commit limit
メモリ上のページングファイルか実メモリが後ろにあるもの
実行形式ファイルなどはディスクから読めばいいのでSystem commitedではない。

private memoryを割り当てなおす必要があるときはページングファイルにメモリ内容をバックアップする。
ページングファイルの上限に当たるとそれ以上の仮想記憶の割り当てができない。
system commit limitを増やすには
・メモリ増設
・ページングファイルサイズ増加
ページングファイルのデフォルトの計算方法は
最小 メモリサイズ
最大 メモリサイズの3倍か4GBの大きいほう

メモリサイズからページングファイルを計算するのではなく、もっとも大きいピーク値
を元に、必要ならば1.5倍や2倍など係数かける。
カーネルのクラッシュダンプが入る大きさであることが重要。

ページングファイルをなくす人もいるが、メモリを有効に使えるので有用。

—–
ここからpart two。
http://blogs.msdn.com/b/tims/archive/2010/10/29/pdc10-mysteries-of-windows-memory-management-revealed-part-two.aspx

 

ワーキングセット
Windowsからプロセスに割り当てられた実メモリ

プロセス
working setの最小、最大サイズをもつ
Windowsは最小サイズをcommitしてロックする。

プロセスが成長していくと、あるところからWindowsはLRUでそのプロセスのページを減らした後に、割り当てる。

commitしたページに触ったときにprivate working set

メモリ管理
free listからzeroページ経由でプロセスにfault in する。
processのWSからとりだされたページはmodifiedかstandy (private dataがflush必要かどうかの違い)

zero list, free listがなくなったら、standby listを使い始める。
standbyもなくなったらmodifiedの中身を書き出したあとでstandbyに移す。
全部なくなったらワーキングセットからメモリを減らす。

タスクマネージャーで表示している内容
Avaiable 欄   zero, free, standby
Cached欄    standby, modified, kernel working set
Free欄     free, zero

free memoryが少ないのはWindowsでは通常状態なので心配ない。
SuperFetchテクノロジーはfreeを小さくすることがゴール。
ファイルをメモリにキャッシュしてfreeからstandbyに移す。

SuperFetchはページの使用頻度、時刻ベースのヒューリスティックを使う。
Windows7でSSDからブートするときはsuperfetchはオフ。

standby listは8個あり、重要性の低いものから再利用。(Vista以降)

メモリが十分かどうかの判断の確実なやり方はない。
available memoryが長い時間少ないままなら足りないかも。
ページングファイルからの読み出しが非常に多いかどうかをProcess monitorでチェックできる。
(カウンターがない)

広告

コメントを残す

コメントを投稿するには、以下のいずれかでログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。