「VMwareのメモリ管理」または「通常メモリのページングとメモリマップドファイルのページングのどちらが効率が良いか?」

VMwareServer/Playerのパフォーマンスチューニング方法として、vmxファイルに

mainMem.useNamedFile = "FALSE"

と書くというのがある。これでディスクI/Oが減るという。http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=1008885


何が変わるかというと、Windowsホストの場合で言うと現象面では次のような違いがある*1

useNamedFile ファイル コミットチャージ
TRUE ゲストメモリサイズのvmemファイルが出来る ほとんど増えない
FALSE vmemファイルは出来ない ゲストメモリサイズだけ増える


この現象から見ると、TRUEのときはゲストメモリはメモリマップドファイルで確保され、FALSEの時は通常のメモリで確保されることがわかる。

ちょっと脇にそれると、FALSEの場合は(ページングが発生するような状況では)ページファイルが最大ゲストメモリサイズ分だけ増える可能性があるので、ページファイルを固定サイズにしている場合は注意が必要である。TRUEの場合は、固定サイズのvmemファイルが出来る代わりにページファイルには影響がない。


さてどちらがいいのかは、通常のメモリのページングと、メモリマップドファイルのページング*2のどちらが効率がいいかだ。メモリの余裕が充分にあり、ページングが発生しない状況ではFALSEの方が効率がよいだろうが、実メモリが不足してページングが発生する状況で、どちらの設定がいいか、おわかりの方がいらっしゃれば教えて頂きたい。


一つ言えるのは、ゲストメモリがGB単位でかつディスクの容量に余裕が少ない場合は、vmemファイルにフラグメンテーションが発生する可能性が高いのに対して、ページファイルの方は事前に充分にサイズを見積もって連続領域に固定サイズでアロケートしておくことが出来れば、フラグメンテーションの影響を受けない。vmemファイルを事前アロケート出来れば同じ土俵になるのだが。まあ、ディスクに連続空き領域が十分確保できる方が正道か。

2010-08-07追記

はてぶホットエントリ経由で知ったが、Linuxホストの場合のvmemファイルについて http://wizardbible.org/49/49.txt というページに書いてある。
これによると、Linuxホストの場合は、

  • mainMem.useNamedFileの指定はほとんど無意味。vmemファイルの出来る場所が違うだけ
  • vmemファイルはスパースファイルで、フラグメンテーションだらけになる。これを回避する手段が上記ページに書いてある*3

ちょっと何だかなあ。。。。
Windowsホストの場合のように、ホストOSのメモリ管理に任せるという機能が何故無いのか、不思議。
なお、念のためだが、Windowsホストの場合はvmemのディスク領域割り当ては一度で行われるので、本文で書いたvmemファイルのフラグメンテーションと上記Linuxの場合のフラグメンテーションとは発生の可能性や度合いが全く異なる。

*1:Linuxでもコミットチャージの用語以外は同じと思われるが

*2:と言うのかな?

*3:一度起動してサスペンドし、vmemファイルをddでコピーしてリネームして、リジュームする