VMware などの仮想機の仕組みを使っていると、いくつもの層に渡って制御するレイヤが入ってきます。それぞれのレイヤ同士でうまくかみ合ってないとパフォーマンスが出ませんよね。とくにストレージまわりでは。
Guest OS Partition Alignment | VMware vSphere Blog - VMware Blogs ← この記事の図にあるとおりなのですが、ディスクIOの単位がそれぞれのレイヤで合ってないと無駄なIOが発生してパフォーマンス劣化が出てしまうよと言う話です。
試しに今使っているPCで見てみます。このPCには Windiws 7 のうえに VMware Player が入っており、CentOS6 が動いています。これをそれぞれのレイヤから見てみましょう。
■ディスク
まずは最下層、ハードウェアのレイヤです。このPCには、Seagate の SSD+HDD のハイブリッドドライブである Momentus XT 750GB ST750LX003 を使っています。データシートを見てみましょう。→ Momentus XT SSHD Data Sheet なるほど、セクタあたりのサイズは 4096 バイトです。 サーバ機ならここがRAIDであったりSANのLUNであったりしますのでそちらの機器の仕様を確認します。
■ホストのパーティションとファイルシステム
次に確認する層はディスク上のパーティションです。Windows であれば msinfo32 で確認できます。次にファイルシステムも調べたいので、diskpart コマンドで調べてしまいましょう。
C:\Windows\system32>diskpart Microsoft DiskPart バージョン 6.1.7601 Copyright (C) 1999-2008 Microsoft Corporation. コンピューター: THINKPADT510 DISKPART> list disk ディスク 状態 サイズ 空き ダイナ GPT ### ミック ------------ ------------- ------- ------- --- --- ディスク 0 オンライン 698 GB 0 B DISKPART> select disk 0 ディスク 0 が選択されました。 DISKPART> list part Partition ### Type Size Offset ------------- ------------------ ------- ------- Partition 1 プライマリ 1200 MB 1024 KB Partition 2 プライマリ 687 GB 1201 MB Partition 3 プライマリ 9 GB 688 GB DISKPART> select part 2 パーティション 2 が選択されました。 DISKPART> detail part パーティション 2 種類 : 07 隠し属性 : いいえ アクティブ : いいえ オフセット (バイト): 1259339776 Volume ### Ltr Label Fs Type Size Status Info ---------- --- ----------- ---- ---------- ------- --------- -------- * Volume 2 C Windows7_OS NTFS Partition 687 GB 正常 ブート DISKPART> select volume 2 ボリューム 2 が選択されました。 DISKPART> filesystems 現在のファイル システム 種類 : NTFS アロケーション ユニット サイズ : 4096 フラグ: 00000000 フォーマットでサポートされているファイル システム 種類 : NTFS (既定) アロケーション ユニット サイズ: 4096 (既定), 8192, 16K, 32K, 64K DISKPART>
パーティションの開始場所は 1259339776 バイトです。1259339776 は 4096 (ディスクのセクタサイズ) の整数倍ですので、セクタの切れ目にキレイにおさまっていますね。ファイルシステムNTFSのユニットサイズは 4096バイトです。サーバ機であればこの辺はVMFSの情報を見るべきでしょう。fdisk -fl などで見れるのではないでしょうか。
■VMDK のセクタサイズ
次に確認する層は VMware のイメージファイル VMDK のセクタサイズです。これはどこを見れば良いのでしょう。起動時の VMware 側のログを見ると 16777216 sectors / 8 GB. とありますので、1セクタ 512 バイトでしょう。
■ゲストOSのパーティション
その次はゲストOSのパーティションを確認です。CentOS 6 を使っていますので、parted コマンドで確認しましょう。
# parted /dev/sda GNU Parted 2.1 /dev/sda を使用 GNU Parted へようこそ! コマンド一覧を見るには 'help' と入力してください。 (parted) unit b (parted) print モデル: VMware, VMware Virtual S (scsi) ディスク /dev/sda: 8589934592B セクタサイズ (論理/物理): 512B/512B パーティションテーブル: msdos 番号 開始 終了 サイズ タイプ ファイルシステム フラグ 1 1048576B 525336575B 524288000B primary ext4 boot 2 525336576B 8589934591B 8064598016B primary lvm (parted)
パーティション2つありますが、どちらも 開始の場所が4096の整数倍ですね。最近のOSであればインストール時にこの辺を考えてパーティションを作ってくれますので安心ですが、たとえば、Windows XP や Windows Server 2003、RHEL5/CentOS5 やもしくはそれ以前の OS はインストール時に作るパーティションを昔ながらの開始アドレスLBA63としてしまいますのでコワイですね。
■ゲストOSのファイルシステム(LVM)
ようやく最後の層でしょうか、ゲストOSのLVMの様子を見てみましょう。
# pvs --units b -o +pe_start PV VG Fmt Attr PSize PFree 1st PE /dev/sda2 vg_centos6 lvm2 a-- 8061452288B 0B 1048576B
PV に格納されている最初の PE のオフセットです。4096の整数倍ですね。ファイルシステムはどうでしょう。
# tune2fs -l /dev/vg_centos6/lv_root | grep 'Block size:' Block size: 4096
揃ったようです。
図にするとこんな感じになります。ファイルシステム上に A, B, C と3つデータがあったとして、全てのレイヤのオフセットが合っていると、たとえば B のデータを読み出すときに物理ディスクは1セクタだけの動作ですみます。ところが、例えばゲストのパーティションのオフセットが下のレイヤと合ってなかったとしましょう。同じくファイルシステム上に A, B, C と3つデータがあったとして、B のデータを読み出すときに物理ディスクのセクタをまたがってしまいます。なるべく減らしたいディスクIOが余計に多くの動きをしなければいけないわけです。
これは困りますから綺麗に並べておきましょうねと言う話です。ゲストOSが古いOSだから既にズレてる? もしストレージが NetApp なら WAFL 上でうまいことズラして誤魔化してくれます。それ以外だったら? いったんデータ捨てて作り直すしか無いようですね。 VMware Converter 5.0.1 の V2V で作り直せば、 最適化レイアウトパーティションの作成 ( Create optimized partition layout ) のオプションが最初から選ばれてますから、うまいこと合わせてくれるらしいですよ。ただしこれはゲストがWindowsの場合のみ。Linuxだとこの選択肢が出てきません。
専用の調整ツールもあるようです。例えば Paragon Alignment Tool。仮想ボリューム上のボリュームを最適化、との売り文句もあります。説明ページの真ん中の辺りに簡単なアニメーションがあってわかりやすいです。