qemu の cache mode には "none", "direcsync", "writeback", "writethrough", "unsafe" の5つがあります。名前からでは、cache mode のそれぞれの仕組みがよくわかりません。そのために、どのようなケースでどの cache mode を使えばいいのか、判断に困ってしまいます。
ここでは、raw ディスクイメージについて、それぞれの cache mode の違いをまとめます。(qcow2 など他のディスクイメージフォーマットでは仕組みが若干ことなります)
Cache Mode 性質比較
それぞれの cache mode ではHost page cache や仮想的な Disk write cache を用いるかどうかで性質が変わってきます。表でまとめると以下のようになります。
cache mode | Host page cache | Disk Write cache | NO Flush |
---|---|---|---|
directsync
| |||
writethrough
|
✓
| ||
none
|
✓
| ||
writeback
|
✓
|
✓
| |
unsafe
|
✓
|
✓
|
✓
|
✓ : on
Host page cache とは、qemu が 仮想マシンイメージファイルを open するときに O_DIRECT フラグをつけるか否かです。"none" と"directsync" では O_DIRECT フラグを"つける" ので、Host page cache を使いません。
Disk Write Cache とは、virtio-blk デバイスの持つ揮発性 cache です。現在では通常のHDDなどは32MB や 64MB のcache を持っていますが、Disk write cache は virtio-blk が持つ仮想的な cache です。qemu の中では Disk Write Cache を使うか否かで flush(fdatasync) のタイミングが異なります。使う場合はOSから flush 要求があった時に flush(fdatasync) しますが、使わない場合は disk write の度に flush(fdatasync)します。qemu が fdatasync を発行することで、Host の Disk にデータが書きだされますが、頻繁に fdatasync すると性能が劣化してしまします。
NO Flush とはqemuが保持している cache を disk へ flush するのを無効化します。無効化することで性能は上がりますが、Host クラッシュ時にゲストでファイル不整合が起こる可能性が増します。
以上を踏まえると、cache mode は以下のように分類できます。
こちらのほうがわかりやすいと思います。
Host page cache あり
|
Host page cache なし
| |
Write 毎 にFlush
|
writethrough
|
directsync
|
Flush 要求時に Flush
|
writeback
|
none
|
Flush 無効
|
unsafe
|
性能比較
それぞれのcache mode のライト性能を、dd で測定しました。
環境は以下となっています。
- HostOS: Fedora 18 (3.7.9-201.fc18.x86_64)
- GuestOS : 同上
- Host FS : ext4 (ordered)
- Guest FS : 同上
- Host memory : 4GB
- Guest memory : 1GB
- qemu : 1.4
- qemu aio : threads
- qemu disk type : raw
測定コマンドは
$ dd if=/dev/zero of=./zero bs=64K count=8Kもしくは
$ dd if=/dev/zero of=./zero bs=64K count=8K oflag=directです。
Cache Mode の性質を比較するために、direct flag をつけた場合でも測定しています。
比較表
通常 write(MB/s)
|
oflag=direct(MB/s)
| |
HOST
|
96.5
|
82.3
|
directsync
|
65.8
|
4.8
|
writethrough
|
62.8
|
4.6
|
none
|
88.3
|
54.2
|
writeback
|
80 ~ 400
|
80 ~ 400
|
unsafe
|
80 ~ 400
|
80 ~ 400
|
"writeback" と "unsafe" ではブレが非常に大きくなっています。これは Host の Page cache の影響です。 "directsync" と "writethrough" では、oflag=direct 時に著しく性能が落ちています。これは qemu が write 毎に fdatasync を発行するためです。
Cache mode の選定
さて、cache mode には色々あり、性質も大きく異なりますが、結局どの mode を選べば良いのでしょうか。指標としては、"メモリ消費量"、"性能"、"安全性" が挙げられます。
"メモリ消費量" で mode に大小をつけると以下のようになります。
directsync = none < writethrough = write back = unsafe
"directsync" と "none" では Host page cache を使用しないため少なくなります。他の mode では Host page cache が効くため、Guest と Host で二重にキャッシュが効いていることになります。つまり、同じデータがメモリ上に重複して存在してしまします。KSM(Kernel Samepage Merging)の仕組みがあるとは言え、キャッシュ重複はメモリを消費するため、好ましいものではありません。
"性能" での優劣は以下となります。
directsync < writethrough < none < writeback < unsafe
"writeback" と "unsafe" は広大な Host page cache を効かせる分、性能は良くなります。write 毎に fdatasync を発行する "directsync" や "writethrough" は性能は劣ります。
"安全性" での優劣は以下となります。ここで、安全性とは、ファイル整合性がとれるまでの時間が短いものを優とします。
unsafe < writeback < none < writethrough = directsync
fdatasync を頻繁に発行する "writethrough" と "directsync" はファイル整合性を取りやすいです。cache を効かせ、Flush 頻度が少ないものほど、安全性は劣ります。
以上を踏まえて、cache mode を選定します。
要件により、選定する cache mode は異なります。
1. とにかく安全第一。物理環境と同程度の安全性が欲しい。
⇛ directsync
cache mode で一番安全なのは O_DIRECT で fdatasync を頻発する directsync です。そのかわり、性能はいまいちです。
2. メモリ消費量は程程に、性能もある程度欲しい。
⇛ none
"none" は Host page cache を使わないため、メモリ消費もそれほど大きくありません。性能も Host には劣りますが、まずまずです。
3. メモリをどれだけ消費しようが、性能が欲しい。
⇛ writeback
"writeback" は広大な Host page cache を使うため、性能が出ます。反面、メモリ消費量は大きいです。
普通に VM をいじる分には "writeback" で。メモリ が多くない環境では "none" にするのがいいと思います。
ちなみに、自分はいつも "none" にしています。
参考文献
An Updated Overview of the QEMU Storage Stack
QEMU Emulator User Documentation
[Qemu-devel] Is cache=writeback safe yet
0 件のコメント:
コメントを投稿