Go to main content
Oracle® Solaris 11.3 カーネルのチューンアップ・リファレンスマニュアル

印刷ビューの終了

更新: 2016 年 11 月
 
 

フラッシュストレージ使用時の ZFS のチューニング

次の情報は、Flash SSD、F20 PCIe Accelerator カード、F40 PCIe Accelerator カード、F5100 フラッシュストレージアレイ、および F80 PCIe Accelerator カードに適用されます。

フラッシュストレージで ZFS を使用する場合は、次の一般的なコメントを確認してください。

  • ZIL (ZFS インテントログ) には、永続的メモリーを使用するコントローラによって管理された LUN または低遅延ディスク (使用可能な場合) の使用を検討してください。このオプションは、コミットの遅延を短縮するためのフラッシュの使用に比べて、費用対効果が大幅に向上する場合があります。ログデバイスのサイズは、最大書き込みスループットを 10 秒間保持するのに十分な大きさのみにとどめる必要があります。例として、ストレージアレイベースの LUN や、バッテリーで保護された書き込みキャッシュを持つ HBA に接続されたディスクがあります。

    このようなデバイスが使用できない場合は、ZFS ストレージプール内のログデバイスとして使用するために、フラッシュデバイスの個別のプールをセグメント分割します。

  • F40、F20、および F80 Flash Accelerator カードは 4 つの独立したフラッシュモジュールを内蔵し、それを OS にエクスポートします。F5100 は、最大 80 の独立したフラッシュモジュールを内蔵します。各フラッシュモジュールは、オペレーティングシステムには 1 つのデバイスとして表示されます。SSD は、OS によって 1 つのデバイスとして表示されます。フラッシュデバイスは、特に NFS サーバーで使用された場合、コミットの遅延を削減するために ZFS ログデバイスとして使用される場合があります。たとえば、フラッシュデバイスの 1 つのフラッシュモジュールを ZFS ログデバイスとして使用することよって、1 つの軽量スレッド操作の遅延を 10 分の 1 に短縮できます。大量の同期操作のスループットを向上させるには、さらに多くのフラッシュデバイスをまとめてストライプ化できます。

  • ログデバイスは、信頼性のためにミラー化してください。最大の保護を実現するために、ミラーは個別のフラッシュデバイス上に作成してください。F20、F40、および F80 PCIe アクセラレータカードの場合は、ミラーを異なる物理 PCIe カード上に配置することによって最大の保護が実現されます。F5100 ストレージアレイでの最大の保護は、ミラーを個別の F5100 デバイス上に配置することによって実現されます。

  • ログデバイスとして使用されていないフラッシュデバイスは、2 番目のレベルのキャッシュデバイスとして使用できます。これは、プライマリディスクストレージから IOPS の負荷を軽減するだけでなく、一般的に使用されるデータの読み取りの遅延を改善させるためにも役立ちます。

ZFS ログデバイスまたはキャッシュデバイスとしてのフラッシュデバイスの追加

ZFS ログデバイスまたはキャッシュデバイスとしてフラッシュデバイスを追加する場合は、次の推奨事項を確認してください。

  • zpool add コマンドを使用すると、ZFS ログデバイスまたはキャッシュデバイスを既存の ZFS ストレージプールに追加できます。zpool add コマンドは、十分に注意して使用してください。ログデバイスを通常のプールデバイスとして誤って追加すると、そのプールを破棄し、最初から復元する作業が必要になります。個々のログデバイス自体をプールから削除できます。

  • アクティブなストレージに対してこの操作を実行しようとする前に、zpool add コマンドについて十分に理解してください。zpool add –n オプションを使用すると、構成を作成することなく構成をプレビューできます。たとえば、次の正しくない zpool add プレビュー構文は、デバイスをログデバイスとして追加しようとしています。

    # zpool add -n tank c4t1d0
    vdev verification failed: use -f to override the following errors:
    mismatched replication level: pool uses mirror and new vdev is disk
    Unable to build pool from specified devices: invalid vdev configuration

    ログデバイスを既存のプールに追加するための正しい zpool add プレビュー構文を次に示します。

    # zpool add -n tank log c4t1d0
    would update 'tank' to the following configuration:
    tank
    mirror
    c4t0d0
    c5t0d0
    logs
    c4t1d0

    複数のデバイスが指定された場合は、それらがまとめてストライプ化されます。詳細は、次の例または zpool(1M) を参照してください。

フラッシュデバイス c4t1d0 を ZFS ログデバイスとして追加できます。

# zpool add pool log c4t1d0

2 つのフラッシュデバイスを使用できる場合は、ミラー化されたログデバイスを追加できます。

# zpool add pool log mirror c4t1d0 c4t2d0

使用可能なフラッシュデバイスを読み取り用のキャッシュデバイスとして追加できます。

# zpool add pool cache c4t3d0

キャッシュデバイスはミラー化できず、まとめてストライプ化されます。

# zpool add pool cache c4t3d0 c4t4d0

フラッシュおよび NVRAM ストレージデバイスの適切なキャッシュフラッシュ動作の保証

ZFS は、ディスクレベルキャッシュを管理するストレージデバイスと一緒に動作するように設計されています。ZFS は一般的にストレージデバイスに対し、キャッシュフラッシュをリクエストすることによって、データを安定したストレージ上に安全に配置するよう要求します。JBOD ストレージの場合、これは設計どおりに動作するため問題はありません。NVRAM ベースの多くのストレージアレイでは、アレイがキャッシュフラッシュリクエストを取得し、それを無視せずに何らかの処理を実際に行う場合、パフォーマンスの問題が発生することがあります。一部のストレージアレイでは、NVRAM 保護によってこれらのキャッシュが安定したストレージと同様に維持されているにもかかわらず、大量のキャッシュをフラッシュします。

ZFS は uberblock 更新のあと、頻繁でないフラッシュを (5 秒程度の間隔で) 実行します。頻繁でないフラッシュはあまり重要でないため、このチューニングの根拠とはなりません。ZFS はまた、アプリケーションが同期書き込みをリクエストするたびフラッシュを実行します (O_DSYNCfsync、NFS コミットなど)。このタイプのフラッシュが終了するまでアプリケーションが待機するため、パフォーマンスに影響します。実際には、大きく影響します。パフォーマンスの観点からは、これにより NVRAM ベースのストレージを使用するメリットが相殺されます。

キャッシュフラッシュのチューニングは、ログデバイスとして使用された場合のフラッシュデバイスのパフォーマンス向上に役立つことが最近示されました。ZFS に公開されているすべての LUN が NVRAM で保護されたストレージアレイのものであり、かつ保護されていない LUN が将来追加されないことが手順によって保証される場合は、zfs_nocacheflush を設定することによって、フラッシュリクエストを発行しないように ZFS をチューニングできます。ZFS に公開された一部の LUN が NVRAM によって保護されていない場合、このチューニングによって、データ損失、アプリケーションレベルの破壊、またはプールの破壊が生じる可能性があります。NVRAM 保護されている一部のストレージアレイでは、キャッシュフラッシュコマンドは無操作であるため、このような状況でチューニングしてもパフォーマンスに差はありません。

最新の OS 変更ではフラッシュリクエストの意味が限定され、ストレージデバイスが適切に保護されている場合は、それらのデバイスにこのリクエストを無視するよう指示されます。この変更には、ディスクドライバに対する修正と、NVRAM デバイスでこの更新内容をサポートするための修正が必要です。NVRAM デバイスがこの機能強化を認識しない場合は、次の手順を使用して、アレイにキャッシュ同期化コマンドを送信しないよう Solaris OS に指示します。この手順を使用する場合は、すべてのターゲット LUN が実際に NVRAM で保護されていることを確認してください。

フラッシュおよび NVRAM デバイスは、自分が不揮発性のデバイスであることや、キャッシュをフラッシュする必要がないことを OS に正しく通知しない場合があります。キャッシュのフラッシュは負荷の大きい操作です。場合によっては、不必要なフラッシュによってパフォーマンスが大幅に低下する場合があります。

次のチューニングエントリを適用する前に、次の zfs_nocacheflush 構文の制限を確認してください。

  • 次のチューニング構文を sd.conf に含めることができますが、ベンダー/製品につき 1 つの sd-config-list エントリのみにする必要があります。

  • 複数のデバイスエントリが必要な場合は、次の構文を使用すると、ベンダー ID と sd チューニング文字列の複数のペアを同じ行に指定できます。

    #              "012345670123456789012345","tuning    ",
    sd-config-list="|-VID1-||-----PID1-----|","param1:val1, param2:val2",
                   "|-VIDN-||-----PIDN-----|","param1:val1, param3:val3";

    前の例で説明されているように、ベンダー ID (VID) 文字列が 8 文字にパディングされ、製品 ID (PID) 文字列が 16 文字にパディングされていることを確認してください。


Caution

注意  -  デバイスによって、すべてのキャッシュ同期化コマンドが無視されます。自己責任において使用してください。


  1. format ユーティリティーを使用して、ストレージアレイの LUN で inquiry サブコマンドを実行します。例:

    # format
    .
    .
    .
    Specify disk (enter its number): x
    format> inquiry
    Vendor:   ATA
    Product:  Marvell
    Revision: XXXX
    format>
  2. アーキテクチャーに基づいて、次のいずれかを選択します。

    • すべてのデバイスについて、/kernel/drv/sd.conf ファイルを /etc/driver/drv/sd.conf ファイルにコピーします。

    • F40 フラッシュデバイスの場合は、/kernel/drv/sd.conf に次のエントリを追加します。次のエントリで、「ATA 」が 8 文字にパディングされ、「3E128-TS2-550B01」に 16 文字が含まれていることを確認してください。文字列の全体の長さは 24 です。

      sd-config-list="ATA  3E128-TS2-550B01","disksort:false, cache-nonvolatile:true, physical-block-size:4096";
    • F80 フラッシュデバイスの場合は、/kernel/drv/sd.conf に次のエントリを追加します。ATA が 8 文字にパディングされ、3E128-TS2-550B01 に 16 文字が含まれていることを確認してください。文字列の全体の長さは 24 です。

      sd-config-list="ATA????2E256-TU2-510B00","disksort:false, cache-nonvolatile:true, physical-block-size:4096";
      
    • F20 および F5100 フラッシュデバイスの場合は、アーキテクチャーに基づいて、次のいずれかを選択します。次のエントリでは、ATA が 8 文字にパディングされ、MARVELL SD88SA02 に 16 文字が含まれています。文字列の全体の長さは 24 です。

    • 次のエントリを /etc/driver/drv/sd.conf に追加します。

      sd-config-list="ATA  MARVELL SD88SA02","throttle-max:32, disksort:false, cache-nonvolatile:true";
  3. 示されているように、sd-config-list エントリでベンダー ID (VID) (ここでは ATA) の長さが 8 文字になり、製品 ID (PID) (ここでは MARVELL) の長さが 16 文字になるように、注意深く空白を追加します。

  4. システムをリブートします。

    パフォーマンスに悪影響を与えることなく、zfs_nocacheflush を元のデフォルト値 (0) にチューニングできます。

  5. フラッシュの動作が正しいことを確認します。

    確認には、システムチェックスクリプトに記述されているスクリプトを使用します。