7.4. ストレージのパフォーマンスとチューニング

7.4.1. Sun ZFS ストレージサーバーのサイジングガイドライン
7.4.2. ZFS ストレージキャッシュについて
7.4.3. Oracle Solaris プラットフォームでの ZIL の管理
7.4.4. Oracle VDI のストレージ用のグローバル設定
7.4.5. ブロックの割り当てについて

7.4.1. Sun ZFS ストレージサーバーのサイジングガイドライン

ディスクレイアウトには、ミラー化セットをストライプ化したものである RAID 10 が推奨され、その場合はデータの ZFS ストライプ化が複数のセット間で自動的に行われます。このレイアウトは 7000 シリーズでは、「ミラー」と呼ばれています。このディスクレイアウトは使用可能なディスク容量の 50% を冗長性に使用しますが、iSCSI の典型的アクセス特性である集中的な小領域のランダムアクセスによる読み取り/書き込みでは、RAID 5 より高速です。

ストレージサーバーは、iSCSI を使用して Oracle VM VirtualBox によりアクセスされる仮想ディスクを提供します。iSCSI は多大な CPU 負荷がかかるプロトコルであるため、ストレージサーバーのコア数が、性能を左右する要素の 1 つとなります。その他の重要な要素には、メモリーサイズ (キャッシュ)、ディスク数、および使用できるネットワーク帯域幅があります。

ネットワーク帯域幅は非常に流動的であり、デスクトップの起動 (* ピークネットワーク帯域幅 *) と使用中のアプリケーションをキャッシュしたデスクトップ (* 平均ネットワーク帯域幅 *) の関係により決定されます。仮想マシン (XP guest) を起動すると 150M バイトのネットワーク負荷が発生し、この負荷は 30 秒以内に満たされなければなりません。同時に多くのデスクトップが起動され、iSCSI トラフィックで作成される負荷をストレージの CPU で処理できる場合、要求されるネットワーク帯域幅は 1Gbps を超える可能性もあります。このシナリオは、交代勤務制を採っている企業では一般的です。このような場合、「プール」、「クローニング」、または「マシンの状態」オプションを「実行中」に設定すると、デスクトップが常に実行中になるため、OS のブートがユーザーのログインから切り離されます。もう 1 つのオプションは、複数のインタフェースを中継して、1 つの IP で 1Gbps を超える帯域幅を提供することです。ジャンボフレームを使用して iSCSI 接続を高速化することもできます。ジャンボフレームは、ネットワークに接続しているすべての部分、つまりストレージサーバー、VirtualBox サーバー、およびスイッチで構成する必要があります。ジャンボフレームは標準化されていないため、非互換のリスクがあります。

Oracle VDI は VirtualBox とともに ZFS の疎ボリューム機能を使用するため、実際に書き込まれるデータがストレージの容量を超えなければ、物理的に使用できる以上のディスク容量をボリュームに割り当てることができます。この機能があり、またクローニングされたデスクトップではテンプレートの変更されないデータが再使用されるため、使用可能なディスク容量が非常に効率的に使用されます。したがって、次に示すディスク容量の計算は、すべてのボリュームがテンプレートと違うデータで完全に使用されると仮定した最悪ケースのシナリオです。

  • コア数 = 使用中の仮想ディスク数 / 200

    例: 2 CPU 構成の x7210 ストレージで各 CPU にコアが 4 つある場合、2 x 4 x 200 = 1600 仮想ディスクまで対応できます

  • メモリーサイズ - 多ければ多いほどよい。空きメモリーは、アクセス時間を低減するディスクキャッシュとして使用できます。

  • ディスク数 = デスクトップ数 / 10

  • 平均ネットワーク帯域幅 [M ビット/秒] = 使用中の仮想ディスク数 x 0.032M ビット/秒

    例: ギガビット Ethernet インタフェース 1 つを備えた x7210 ストレージが対応できる仮想ディスクの数は、1000 / 0.032 = 31250 までです

  • ピークネットワーク帯域幅 [M ビット/秒] = 使用中の仮想ディスク数 x 40M ビット/秒

    例: ギガビット Ethernet インタフェース 1 つを備えた x7210 ストレージが対応できる仮想ディスクの数は、1000 / 40 = 25 までです

  • ディスク容量 [G バイト] = デスクトップ数 x 仮想ディスクサイズ [G バイト]

    例: 容量が 46T バイトの x7210 ストレージは、46 x 1024G バイト / 2 / 8G バイト = 2944 台の 8G バイトディスク (RAID 10 構成) をサポートできます

注記

デスクトップのパフォーマンスを改善する方法の詳細については、「デスクトップイメージの作成」 のデスクトップイメージの最適化に関するセクションを参照してください。

7.4.2. ZFS ストレージキャッシュについて

このセクションでは、ZFS キャッシュの構造とパフォーマンスの簡単な概要と、ZFS キャッシュを Sun Storage 7000 シリーズ Unified Storage System のハードウェアにマップする方法について説明します。

背景

Zettabyte File System (ZFS) は、サポートされている Solaris および Sun Storage 7000 シリーズ Unified Storage System のストレージプラットフォームのベースとなるファイルシステムです。

Adaptive Replacement Cache (ARC) は、メインメモリー (DRAM) の ZFS 読み取りキャッシュです。

Second Level Adaptive Replacement Cache (L2ARC) はメインメモリー以外の場所に読み取りキャッシュデータを格納する場合に使用されます。Sun Storage 7000 シリーズ Unified Storage System は、Readzilla と呼ばれる、L2ARC の読み取り用に最適化された SSD を使用します。SSD は DRAM よりも低速ですが、ハードディスクよりはかなり高速です。L2ARC では非常に大きなキャッシュを使用できるため、読み取りのパフォーマンスが改善されます。

ZFS Intent Log (ZIL) は、同期書き込みとクラッシュした場合の復旧の POSIX 要件を満たしています。非同期書き込みには使用されません。ZFS のシステム呼び出しは ZIL によって記録され、システムがクラッシュした場合に再現するのに十分な情報が含まれています。Sun Storage 7000 シリーズ Unified Storage System では、Readzilla と呼ばれる、書き込み用に最適化された SSD を ZIL に使用します。Logzilla が使用できない場合はハードディスクが使用されます。

書き込みキャッシュは、速く書き込むために揮発性 (電源を切ると情報が失われる) DRAM にデータを格納する場合に使用されます。Sun Storage 7000 シリーズ Unified Storage System の書き込みキャッシュが有効である場合は、システム呼び出しは ZIL に記録されません。

パフォーマンスの懸案事項

パフォーマンスを改善するために、キャッシュ内のデータと同じ量を格納するように読み取りキャッシュをサイジングします。最初に ARC (DRAM) を最大にし、次に L2ARC (Readzilla) を追加します。

Oracle VDI では、Oracle VDI が使用するすべての iSCSI ボリュームの書き込みキャッシュがデフォルトで有効になっています。ZIL を使用しないため、この構成は非常に高速であり、Logzilla を利用しません。ZIL を使用しないと、Sun Storage 7000 シリーズ Unified Storage System がリブートする場合、またはデスクトップがアクティブである間に電源が失われた場合に、データが失われる危険があります。ただし、これによって ZFS 自体が破損することはありません。

Oracle VDI の書き込みキャッシュを無効にして、データ損失のリスクを最小限に抑えます。Logzilla を使用しない場合、ZIL は使用可能なハードディスクによってバックアップされるため、パフォーマンスが著しく低下します。ZIL をスピードアップするには、Logzilla を使用します。2 つまたは 4 つの Logzilla を使用する場合は、「ストライプ化された」プロファイルを使用してパフォーマンスをさらに改善します。

インメモリー書き込みキャッシュをオフにするには、Oracle VDI Manager でストレージを選択し、「編集」をクリックしてストレージの編集ウィザードを開き、「キャッシュ」チェックボックスをオフにします。この変更は、新たに作成する Oracle VM VirtualBox のデスクトップと、Microsoft Hyper-V 仮想プラットフォームで新たに起動するデスクトップに適用されます。

7.4.3. Oracle Solaris プラットフォームでの ZIL の管理

Oracle Solaris 10 10/09 (以降) のストレージプラットフォームを高速化する 1 つの方法は、ZFS Intent Log (ZIL) を無効にすることです。高速化する方法は複数ありますが、ディスク I/O の同期、およびストレージに障害が発生した場合のデータの整合性が重要な場合は、ZIL を無効にすると危険であることに注意してください。

ZIL をただちに無効にするコマンドは次のとおりです:

echo zil_disable/W0t1 | mdb -kw

ZIL をただちに有効にするコマンドは次のとおりです:

echo zil_disable/W0t0 | mdb -kw

ZIL を無効にするコマンドがリブート後も有効にならないようにするには、/etc/system を編集して次の行を追加します。

set zfs:zil_disable=1

ZFS プールがマウントされている場合、ZIL の状態を変更すると特定の ZFS プールに影響するため、設定値を変更したら (リブートの間に暗黙的に実行される)、ZFS プールを作成、再マウント、またはインポートする必要があります。

ZIL の設定はストレージに対してグローバルに適用され、リブート後はストレージのすべての ZFS プールの ZIL が無効になるため、同期セマンティクスがなくなり、ZFS が提供するシステムのルートボリュームが不要な動作を示す可能性があります。

このような影響の競合を避けるためのベストプラクティスは、少なくとも 2 つのディスクを持つサーバーを使用することです。1 番目のディスクは、UFS ファイルシステムを使用して OS のシステムスライスをホストします。残りのディスクを ZFS 形式にして、Oracle VDI のストレージとして使用します。これを行うと ZIL を無効にすることができ、ZIL には ZFS のみを使用するため、UFS ディスクは引き続き同期セマンティクスを提供します。

ZFS および ZIL の参照用ページは次のとおりです:

http://www.solarisinternals.com/wiki/index.php/ZFS_Evil_Tuning_Guide#Disabling_the_ZIL_.28Don.27t.29

7.4.4. Oracle VDI のストレージ用のグローバル設定

このセクションでは、ストレージに適用する Oracle VDI のグローバル設定について説明します。これらの設定を一覧表示および編集するには、vda settings-getprops および vda sett ngs-setprops コマンドを使用します。

グローバル設定

説明

storage.max.commands

ストレージで並行して実行されるコマンド数。

デフォルトは 10 です。

この設定を変更するには、Oracle VDI サービスを再起動する必要があります。

この設定は Oracle VDI インストールに対してグローバルであり、IP または DNS 名によって決定される物理ストレージに適用されます。

Oracle VDI のホスト数は、物理ストレージで Oracle VDI によって実行される並列記憶装置の最大アクション数に影響しません。「ストレージが応答しない」というメッセージが断続的に表示される場合は、この数値を減らしてストレージの負荷を軽減します。これを行うと、クローニングとリサイクルのパフォーマンスに影響します。

そのホストで Oracle VDI Center エージェントが実行しなくなっている場合でも、この設定は機能します。

この設定は、Oracle VM VirtualBox (Solaris 上) および Microsoft Hyper-V デスクトッププロバイダと一緒に使用されている Sun ZFS ストレージのみに適用されます。

storage.query.size.interval

Oracle VDI サービスがストレージに対してディスク容量の合計と使用可能なディスク容量を問い合わせる時間 (秒)。

デフォルトは 180 秒です。

これを実行するのは 1 つの Oracle VDI ホストのみであるため、通常はこの設定を変更する必要はありません。

この設定はすべてのストレージタイプに適用されます。

storage.watchdog.interval

Oracle VDI サービスがストレージに対して可用性を問い合わせる時間 (秒)。

デフォルトは 30 秒です。

これを実行するのは 1 つの Oracle VDI ホストのみであるため、通常はこの設定を変更する必要はありません。

この設定はすべてのストレージタイプに適用されます。

storage.fast.command.duration

高速のストレージコマンドが失敗したと Oracle VDI サービスが判断する時間 (秒)。

デフォルトは 75 秒です。

この設定を変更するには、Oracle VDI サービスを再起動する必要があります。

このコマンドの期間を使用する Oracle VDI 機能のみが、ストレージのウォッチドックとなり、定期的に ping を発行してストレージの可用性を確認します。

この設定は、Oracle VM VirtualBox (Solaris 上) および Microsoft Hyper-V デスクトッププロバイダと一緒に使用されている Sun ZFS ストレージのみに適用されます。

storage.medium.command.duration

中位の速度のストレージコマンドが失敗したと Oracle VDI サービスが判断する時間 (秒)。

デフォルトは 1800 秒 (30 分) です。

この設定を変更するには、Oracle VDI サービスを再起動する必要があります。

Oracle VDI が使用するストレージコマンドの大部分は、このコマンド期間を使用します。

この設定は、Oracle VM VirtualBox (Solaris 上) および Microsoft Hyper-V デスクトッププロバイダと一緒に使用されている Sun ZFS ストレージのみに適用されます。

storage.slow.command.duration

低速のストレージコマンドが失敗したと Oracle VDI サービスが判断する時間 (秒)。

デフォルトは 10800 秒 (3 時間) です。

この設定を変更するには、Oracle VDI サービスを再起動する必要があります。

Oracle VDI が使用する一部の複雑なストレージスクリプトのみが、このコマンド期間を使用します。このようなスクリプトは頻繁には実行されず、通常は 1 日に 1 回です。

この設定は、Oracle VM VirtualBox (Solaris 上) および Microsoft Hyper-V デスクトッププロバイダと一緒に使用されている Sun ZFS ストレージのみに適用されます。

storage.max.commands 設定は、もっとも頻繁に変更される設定です。デフォルトでは、Sun Storage 7000 シリーズ Unified Storage System は 4 つのコマンドのみを並行して実行でき、残りのコマンドはキューに投入されます。パフォーマンスを向上させるために、Oracle VDI VDI は意図的にストレージキューをオーバーコミットします。たとえば負荷が高いためにストレージが低速になった場合、キューのコマンドの実行に時間がかかりすぎている可能性があり、期間設定に指定された期間よりもコマンドの実行時間が長い場合、ストレージが応答できないと不適切にマーク付けされている可能性があります。このような状況が定期的に発生する場合は、storage.max.commands 設定の値を小さくすることができますが、ストレージがビジーでない場合は、値を小さくすることでパフォーマンスが低下する場合があります。

これらのコマンドは Oracle VDI Center 内のプライマリホストのみが実行するため、間隔の設定はほとんど変更する必要はありません。この設定の値を小さくすると、ストレージのディスク容量に関する情報がより新しくなり、応答しないストレージホストの検出が速くなりますが、ストレージホストの負荷が高くなります。これらの設定値のデフォルトを維持することをお勧めします。

期間の設定値には安全のためのマージンが含まれています。ストレージが割り当てられた時間内にコマンドを実行できない場合のみに、期間の設定値を変更します。

7.4.5. ブロックの割り当てについて

標準的なハードディスクのブロックサイズは 512 バイトです。仮想マシンのゲストオペレーティングシステムによっては、ゲストファイルシステムの 1 つの論理ブロックでストレージの 2 つのブロックが使用されることがあります。これはブロックの不整列と呼ばれます。図 7.2に例を示します。ブロックの不整列が発生すると、ゲスト OS ファイルシステムのブロックにアクセスする場合にストレージでの IO が倍になる (完全なランダムアクセスパターンを使用し、キャッシュを使用しないことを前提とする) ため、ブロックの不整列を避けることをお勧めします。

図7.2 Sun ZFS ストレージでの不整列ブロックと整列ブロックの例

この図は仮想ディスクの 2 つの例を示しており、1 つは正しく整列されていて、1 つは不整列になっています。

Windows XP では、デフォルトではパーティションが正しく整列されないため、ブロックの不整列が発生します。Windows Vista と Windows 7 では、通常はパーティションが正しく整列されるため、ブロックが整列されます。

ブロックの割り当ての確認

通常、ディスク上の 1 つのパーティションはディスクセクター 63 から始まります。Windows パーティションの整列を確認するには、次のコマンドを使用します:

wmic partition get StartingOffset, Name, Index

このコマンドの出力例を次に示します:

Index Name                   StartingOffset 
0     Disk #0, Partition #0  32256

開始セクターを見つけるには、StartingOffset の値を 512 (ハードディスクのブロックサイズ) で割ります:

32256 ÷ 512 = 63

NTFS クラスタのサイズは、通常 4K バイトです。最初の NTFS クラスタはディスクセクター 63 から始まり、ディスクセクター 70 で終わります。

Zettabyte File System (ZFS) ファイルシステムを使用するストレージタイプのデフォルトのブロックサイズは 8K バイトです。したがってこのストレージでは、4 番目の ZFS ブロックがディスクセクター 48 - 63 にマップされ、5 番目の ZFS ブロックセクターがディスクセクター 64 - 79 にマップされます。

Oracle Cluster File System version 2 (OCFS2) を使用するストレージタイプのデフォルトのブロックサイズは 4K バイトです。したがってこのストレージでは、8 番目の OCFS2 ブロックがディスクセクター 56 - 63 にマップされ、9 番目の OCFS2 ブロックセクターがディスクセクター 64 - 73 にマップされます。

図 7.2 に示すように、1 番目の NTFS クラスタにアクセスする場合にストレージの複数のブロックにアクセスする必要があるため、両方のストレージタイプ間で不整列が発生します。

ブロックを正しく整列させるには、StartingOffset の値が、ストレージのファイルシステムで使用されているブロックサイズに応じて 8192 または 4096 で完全に割り切れる必要があります。

次の例では、ブロックの不整列が発生します:

wmic partition get StartingOffset, Name, Index
Index Name                   StartingOffset 
0     Disk #0, Partition #0  32256

32556 ÷ 8192 = 3.97412109

32556 ÷ 4096 = 7.94824219

次の例では、ブロックは整列されます:

wmic partition get StartingOffset, Name, Index
Index Name                   StartingOffset 
0     Disk #0, Partition #0  32768

32768 ÷ 8192 = 4

32768 ÷ 4096 = 8

ブロックの割り当ての修正

Windows 2003 SP1 以降の diskpart.exe ユーティリティーには、パーティションのブロック整列を指定するための align オプションがあります。Windows XP では、parted などのサードパーティーのディスクパーティション分割ツールを使用して、開始セクターを定義してパーティションを作成します (次の例を参照)。その他のオペレーティングシステムでのパーティションの整列方法の詳細については、システムドキュメントを参照してください。

ブロックが正しく整列された Windows XP 用ディスクの準備方法の例

この例では、Knoppix などのブート可能なライブ Linux システムのディスクユーティリティーを使用して、ブロックが正しく整列されたディスクパーティションを作成します。

  1. 新しい仮想マシンを作成します。

  2. ライブ Linux システムの ISO イメージを、仮想マシンの CD/DVD-ROM ドライブに割り当てます。

  3. 仮想マシンをブートします。

  4. コマンドシェルを開き、root ユーザーになります。

  5. ディスクの合計セクター数を取得します。

    ディスクの情報を取得するには、fdisk -ul コマンドを使用します。

    次の例では、ディスクのセクター数は 20971520 です:

    # fdisk -ul
    Disk /dev/sda doesn't contain a valid partition table
    
    Disk /dev/sda: 10.7 GB, 10737418240 bytes
    255 heads, 63 sectors/track, 1305 cylinders, total 20971520 sectors
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk identifier: 0x00000000
  6. ディスクに MS-DOS パーティションテーブルを作成します。

    パーティションテーブルを作成するには、parted <disk> mklabel msdos コマンドを使用します。

    次の例では、/dev/sda ディスクにパーティションテーブルが作成されています:

    # parted /dev/sda mklabel msdos
  7. パーティションの開始セクターと終了セクターを指定して、新しいパーティションを作成します。

    パーティションを作成するには、parted <disk> mkpartfs primary fat32 64s <end-sector>s コマンドを使用します。<end-sector> はディスクの合計セクター数から 1 を引いた数です。たとえば、ディスクのセクター数が 20971520 の場合、<end-sector> は 20971519 です。

    使用する parted のバージョンによっては、最適なパフォーマンスが得られるようにパーティションが適切に整列されていないという警告が表示される場合があります。この警告は無視しても問題ありません。

    次の例では、/dev/sda ディスクにパーティションが作成されます:

    # parted /dev/sda mkpartfs primary fat32 64s 20971519s                          
  8. パーティションが作成されたことを確認します。

    パーティションを確認するには、parted <disk> print コマンドを使用します。

    次の例では、/dev/sda ディスクのパーティションを確認しています:

    # parted /dev/sda print
    Model: ATA VBOX HARDDISK (scsi)
    Disk /dev/sda: 10.7GB
    Sector size (logical/physical): 512B/512B
    Partition Table: msdos
    
    Number  Start   End     Size    Type     File system  Flags
     1      32.8kB  10.7GB  10.7GB  primary  fat32        lba
  9. 仮想マシンをシャットダウンし、ISO イメージの割り当てを解除します。

  10. Windows XP のインストール ISO イメージを仮想マシンの CD/DVD-ROM ドライブに割り当てます。

  11. 仮想マシンをブートし、Windows XP をインストールします。

  12. プロンプトが表示されたら、新しく作成されたパーティションを選択します。

  13. (省略可能) プロンプトが表示されたら、ファイルシステムを FAT32 から NTFS に変更します。

  14. インストールを完了します。

  15. 管理者として Windows XP ゲストにログインします。

  16. StartingOffset が 32768 であることを確認します。

    wmic partition get StartingOffset, Name, Index
    Index Name                   StartingOffset 
    0     Disk #0, Partition #0  32768