VMware 仮想機のパフォーマンス劣化を防ぐための Partition Alignment

VMware などの仮想機の仕組みを使っていると、いくつもの層に渡って制御するレイヤが入ってきます。それぞれのレイヤ同士でうまくかみ合ってないとパフォーマンスが出ませんよね。とくにストレージまわりでは。
Guest OS Partition Alignment | VMware vSphere Blog - VMware Blogs ← この記事の図にあるとおりなのですが、ディスクIOの単位がそれぞれのレイヤで合ってないと無駄なIOが発生してパフォーマンス劣化が出てしまうよと言う話です。

試しに今使っているPCで見てみます。このPCには Windiws 7 のうえに VMware Player が入っており、CentOS6 が動いています。これをそれぞれのレイヤから見てみましょう。

■ディスク

まずは最下層、ハードウェアのレイヤです。このPCには、SeagateSSD+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 XPWindows Server 2003RHEL5/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。仮想ボリューム上のボリュームを最適化、との売り文句もあります。説明ページの真ん中の辺りに簡単なアニメーションがあってわかりやすいです。