ZFS は、ディスクレベルキャッシュを管理するストレージデバイスと一緒に動作するように設計されています。ZFS は一般的にストレージデバイスに対し、キャッシュフラッシュをリクエストすることによって、データを安定したストレージ上に安全に配置するよう要求します。JBOD ストレージの場合、これは設計どおりに動作するため問題はありません。NVRAM ベースの多くのストレージアレイでは、アレイがキャッシュフラッシュリクエストを取得し、それを無視せずに何らかの処理を実際に行う場合、パフォーマンスの問題が発生することがあります。一部のストレージアレイでは、NVRAM 保護によってこれらのキャッシュが安定したストレージと同様に維持されているにもかかわらず、大量のキャッシュをフラッシュします。
ZFS は uberblock 更新のあと、頻繁でないフラッシュを (5 秒程度の間隔で) 実行します。頻繁でないフラッシュはあまり重要でないため、このチューニングの根拠とはなりません。ZFS はまた、アプリケーションが同期書き込みをリクエストするたびフラッシュを実行します (O_DSYNC、fsync、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 文字にパディングされていることを確認してください。
注意 - デバイスによって、すべてのキャッシュ同期化コマンドが無視されます。自己責任において使用してください。 |
format ユーティリティーを使用して、ストレージアレイの LUN で inquiry サブコマンドを実行します。例:
# format . . . Specify disk (enter its number): x format> inquiry Vendor: ATA Product: Marvell Revision: XXXX format>
アーキテクチャーに基づいて、次のいずれかを選択します。
すべてのデバイスについて、/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";
示されているように、sd-config-list エントリでベンダー ID (VID) (ここでは ATA) の長さが 8 文字になり、製品 ID (PID) (ここでは MARVELL) の長さが 16 文字になるように、注意深く空白を追加します。
システムをリブートします。
パフォーマンスに悪影響を与えることなく、zfs_nocacheflush を元のデフォルト値 (0) にチューニングできます。
フラッシュの動作が正しいことを確認します。
確認には、Appendix A, システムチェックスクリプトに記述されているスクリプトを使用します。