8.4. ストレージ

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

8.4.1. ストレージサーバーのサイジングガイドライン

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

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

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

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

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

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

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

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

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

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

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

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

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

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

注記

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

8.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 は、L2ARC の読み取り用に最適化された SSD (Readzillas と呼ばれる) を使用します。SSD は DRAM よりも低速ですが、ハードディスクよりはかなり高速です。L2ARC では非常に大きなキャッシュを使用できるため、読み取りのパフォーマンスが改善されます。

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

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

パフォーマンスの考慮事項

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

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

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

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

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

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

図8.2 不整列ブロックと整列ブロックと例

この図は、仮想ディスクの 2 つの例を示しています。一方は正しく整列しており、もう一方は整列していません。

Windows XP は、ブロックの不整列が発生する可能性がある特殊な例です。通常、ディスク上の 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 で終わります。ストレージでは、4 番目の ZFS ブロックがディスクセクター 48 ~ 63 にマップされ、5 番目の ZFS ブロックセクターがディスクセクター 64 ~ 79 にマップされます。図8.2「不整列ブロックと整列ブロックと例」に示すように、1 番目の NTFS クラスタにアクセスする場合に両方の ZFS ブロックにアクセスする必要があるため、不整列が発生します。

ブロックを正しく整列させるには、StartingOffset の値が完全に 8192 (基盤となる ZFS ストレージのデフォルトのブロックサイズ) で割り切れる必要があります。

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

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

32556 ÷ 8192 = 3.97412109

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

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

32768 ÷ 8192 = 4

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

8.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 エージェントが実行しなくなっている場合でも、このオプションは機能します。

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 を発行してストレージの可用性を確認します。

storage.medium.command.duration

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

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

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

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

storage.slow.command.duration

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

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

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

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

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

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

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

8.4.5. 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