書き込みキャッシュを適切に処理するSATAディスク


15

データベースに使用される個々のディスクで書き込みキャッシュを無効にすることをアドバイスするのは非常に一般的です。そうしないと、一部のディスクがまだディスク表面に到達していない書き込みを確認するからです。

これは、一部のディスクがディスク表面に到達するまで書き込みを認識しないことを意味します(更新:または、キャッシュをフラッシュするように求められたときに正確に報告します。そのようなディスクはどこにありますか、または信頼できる情報はどこにありますかそのようなディスクはどこにありますか?

書き込みキャッシュを使用することで本当にメリットがあるDBサーバーをセットアップしていますが、アプリケーションは価格に敏感であり、十分な情報がないため、一部のキャッシュRAIDコントローラーのディスクサブシステムのコストを2倍にしたくない各ドライブのキャッシュを信頼できるかどうかを知る。


linuxでは、hdparamを介してドライブごとに書き込みキャッシュを無効にできます。SATAドライブの場合、再起動のたびにこれを再適用するにはスクリプトを作成する必要があると思います。バッテリーでバックアップされたRAIDコントローラーを使用せずにパフォーマンス要件を満たすことができる場合は、そのようにすることができます。シンプルで安価なので、可能な場合はソフトウェアRAIDを使用することを好みます。いずれにせよ、私は間違いなくUPSを持っています。
eas

回答:


15

一般的に、あなたの質問に対する直接的な答えとして、書き込みキャッシュを有効にした場合の適切な動作に関連してドライブ自体にバグがあったことを、SATAドライブの主要なブランドについて知りません。つまり、ドライブの観点からのみ、ドライブはキャッシュの観点から想定されることを実行します。また書き込みキャッシュ有効になっている場合でも、SATAケーブルでのディスク書き込みから物理的に更新される回転メディアへの遅延は非常に短い(通常50〜100ミリ秒)ことに注意しください。ダーティキャッシュデータが一度に数秒間そこに座っているだけではありません.....ドライブはキャッシュからダーティデータを取得しようとし続けていますできるだけ早く物理メディアに。これはデータの安全性の問題だけでなく、将来の書き込みを遅滞なく受け入れる準備ができていること(書き込みの投稿)の1つです。

キャッシュが有効になっているときに発生する問題は、SATAケーブルを介したドライブへの書き込み順序と回転メディアへの書き込み順序が同じではないことです。キャッシュのすべての内容がディスクに書き込まれる前に電源が切れたり、システムがクラッシュしたりしない限り、これが問題を引き起こすことはありません。どうして?->

ここで発生する可能性のある問題は、ファイルシステムおよび/またはデータベースファイルの内容のトランザクションの堅牢性に関連しており、これらの順不同の書き込み損失です。事実上、これらの順序が狂った書き込みが失われると、理論的には、メディアへの非常に特定の順序でディスク書き込みが行われることで保証されるはずのトランザクションロジックの整合性が破損する可能性があります。

もちろん、ファイルシステム、データベース、RAIDコントローラーなどの設計者は、書き込みキャッシュに関連するこの現象を認識しています(または、確実に認識すべきです)。書き込みキャッシュは、ほとんどのランダムアクセスタイプのI / Oシナリオのパフォーマンスの観点から非常に望ましいものです。実際、書き込みキャッシュを使用可能にすることは、より高度なネイティブコマンドキューイング(NCQ)これは、新しいSATAおよび最後の数世代のPATA実装でサポートされています。そのため、このような特定の重要な時点で物理メディアへの順序を保証するために、ファイルシステムやアプリケーションなどは、メディアへの書き込みキャッシュのフラッシュを具体的に要求できます。この同期要求の完了時-(潜在的に)ファイルバッファー、OSディスクキャッシュ、物理ディスクキャッシュなどから保留中のすべては、適切な重要な操作でトランザクションシステムの設計ごとに実際にメディアに出力されます。つまり、プログラマーが最上位で適切な呼び出しを行い、このソフトウェアチェーンとハードウェアレイヤーのチェーンのすべての要素が正しく機能した場合、これは正しく行われます。つまり、ドライブ、RAIDコントローラー、ディスクドライバー、OSキャッシュ、ファイルシステム、データベースエンジンなどにこの点に関するバグはありません。これは、すべてが正確に動作する必要がある多くのソフトウェアです。さらに、通常、ほとんどすべての状況で書き込み順序はまったく関係ないため、この点で正確性を検証することは非常に困難です。そのため、最終的には、この用語のさまざまなレイヤーや意味の1つまたは複数で「書き込みキャッシュをオフにする」...特定の種類の問題を「修正する」という評判があります。実際には、RAIDコントローラーやOSディスクキャッシュ、ドライブなどの書き込みキャッシュ動作を停止することで、システムの1つ以上のバグを回避できます。また、停電や衝突のシナリオは構築するのが難しいテストです。したがって、最終的には、この用語の1つまたは複数のさまざまなレイヤーや意味で「書き込みキャッシュをオフにする」ことは、特定の種類の問題を「修正する」という評判を持っています。実際には、RAIDコントローラーやOSディスクキャッシュ、ドライブなどの書き込みキャッシュ動作を停止することで、システムの1つ以上のバグを回避できます。また、停電や衝突のシナリオは構築するのが難しいテストです。したがって、最終的には、この用語の1つまたは複数のさまざまなレイヤーや意味で「書き込みキャッシュをオフにする」ことは、特定の種類の問題を「修正する」という評判を持っています。実際には、RAIDコントローラーやOSディスクキャッシュ、ドライブなどの書き込みキャッシュ動作を停止することで、システムの1つ以上のバグを回避できます。

とにかく、質問の核心に戻ると、SATAでは、すべてのディスク読み取り/書き込みコマンドとフラッシュキャッシュコマンドの特定の処理は、SATA仕様によって明確に定義されています。さらに、ドライブメーカーは、Seagate Barracudaドライブのこの例のように、各ドライブモデルまたはドライブファミリの実装とこれらのルールへの準拠を説明する詳細なドキュメントを用意する必要があります。特に、SATA SET FEATURESの詳細をご覧ください。ドライブの動作モードを制御するコマンド、特にオプション82hを使用すると、ドライブレベルでディスクキャッシュを無効にできます。これは、デフォルトで、認識しているすべてのドライブで書き込みキャッシュが有効になっているためです。キャッシュを本当に無効にしたい場合、このコマンドは各ドライブのリセットまたは電源投入の開始時に実行する必要があり、通常はオペレーティングシステムのディスクドライバーの制御下にあります。IOCTLおよび/またはレジストリ設定タイプを使用してこのモードを設定するようにOSドライバーを奨励することもできますが、これは大きく異なります。


5
私の答えに対する編集上のメモ:ハードウェアRAIDコントローラーは、書き込みキャッシュの内部実装に関連する問題を含む多くの問題に関連して有名です。理由はわかりませんが、逸話的に言えば、RAIDコントローラーは、これほど広く使用されているものに関して、これまでに書かれた最もバグの多いソフトウェアのようです。確かに、非常に評判の良いベンダーの非常に主流で、十分に確立され、広く展開されているRAIDハードウェアを使用することは確かに有益です。
背の高いジェフ

ジェフ、ありがとう。私はこれについて多くの読書をしてきましたが、今までと同じくらい混乱しています。私が今苦労している問題は、アプリケーションとファイルシステムが利用可能なさまざまなメカニズムを使用して適切な書き込み順序を保証するようにブロック層に指示できる「書き込みバリア」に関係していると思います。残念ながら、障壁の実装にはあらゆる種類の問題があります。LVMは、基本的なデバイスがサポートしていても、明らかにサポートしていないようです。また、システム管理者は、ドライブキャッシュのフラッシュを強制的にfsync持つのオプションを持っているべきであると私には思える
EAS

@eas-あなたが言う「書き込みバリア」という用語は、上記の回答でキャッシュの「同期」または「フラッシュ」と呼んだのと同じ基本メカニズムです。要するに、これはファイルアクセス「スタック」のさまざまなレイヤーで開始できます。真の書き込みバリアを構築するには、保留中の書き込みデータ(つまり、ダーティキャッシュまたはライトバックバッファー)を持つすべてのレイヤーから物理メディアまで影響を与えて、実際に意図したとおりに機能する必要があります。そのチェーン内の切断されたリンクは、書き込みが並べ替えられたときに潜在的な問題を引き起こすものです。
背の高いジェフ

ディスクは、メディアへの書き込みを数秒間遅らせることができます。もちろん、ディスクキャッシュをオーバーフローする書き込みがさらに多数ある場合、メディアへの書き込みが強制されます。NCQは書き込みキャッシュを厳密に必要としません。多くの書き込みコマンドと読み取りコマンドを保留し、ディスクが最高のパフォーマンスを得ると思う順序で発行できます。また、NCQでは、書き込みの順序に意味がありません。ファイルシステムとデータベースはIOバリアを使用する必要があります。
バルクも

3

バッテリーバックアップキャッシングディスクコントローラーがドライブ上のキャッシュを無効にするのは私の経験です。そうでなければ、オンディスクキャッシュを無効にする方法を知りません。ディスク上のキャッシュを無効にできたとしても、パフォーマンスは大幅に低下します。

低コストのオプトインには、システムを正常にシャットダウンするように信号を送ることができる安価なUPSを使用できます。


上記の私のコメントはここに追加されるべきでした。私はまだこのサイトを学んでいます。
eas

一部のRAIDコントローラーは常にオンディスクキャッシュを無効にしますが、一部のRAIDコントローラーは無効にし、一部には設定があります。この動作は基本的に、RAIDコントローラーのキャッシング戦略の実装がどのようなものであるかに依存します。実装によっては、ディスクへの書き込み順序を実際に制御したい場合がありますが、他の実装ではそれほど重要ではありません。私は答えでここの問題のいくつかをほのめかします。
トールジェフ

確かに小さなテストセット(LSI 9261 RAIDコントローラー、SATA、NL SAS、およびSASドライブ)で、ドライブがバッター/キャパシティバックアップキャッシュを備えたRAIDコントローラーに接続されているときにドライブ書き込みキャッシュを有効にしても、 RAIDコントローラーキャッシュを備えている以上のパフォーマンス。これが難しい規則であるとはまだ言いませんが、ドライブコントローラーを無効にするRAIDコントローラーが必ずしも問題ではないことは明確です。
ダニエルローソン

2

キャッシュを維持するために、バッテリーではなくスーパーキャパシターを備えたRAIDシステムを使用しています。バッテリーは消耗し、監視し、交換する必要があり、これらの点で潜在的な障害点を表します。起動時にコンデンサが充電され、UPSからの電力が失われた場合にキャッシュをフラッシュし、実質的に永久に持続し、監視を必要としません。および障害時にシステムを完全にシャットダウンするソフトウェア-通常、電源が回復した場合にシャットダウンする前に5〜15分(UPSの負荷と使用可能なバッテリーに応じて)与えます。

雷雨の際には、時々外出する直前にライトがちらつくのを見るかもしれません(またはパワーシステムが良くなっているかもしれません)。これはリクローサーと呼ばれるデバイスです。これは、過負荷が一時的なものである場合にトリップしたときに開いているスイッチを閉じようとするサーキットブレーカーです。3回試行した後、閉じたままにできない場合、開いたままになります。いくつかの貧しい男は雨の中に出て対処しなければなりません。彼とあなたが私がすることを2回だけ、そしてそれが時間外ならそれは危険な仕事であるということを2回だけ作りながら、彼にあまりにも残念に思わないでください。


2

ディスクライトバックキャッシュの誤解の1つは、停電時にのみデータを失うことです。これは、特にsATAデバイスでは常にそうとは限りません。sATAデバイスにエラー(コーナーケースのFWバグやコントローラーバグなど)があり、それがリセットまたは外部でリセットされた場合、ライトバックキャッシュ内のデータがハング後もまだ利用可能であるという保証はありません。

これにより、デバイスに一時的なエラーが発生し、リセットされ、ダーティキャッシュが失われるとデータが失われ、ドライバーのブロックレベルを超えて沈黙するシナリオが発生する可能性があります。

さらに悪いことに、OSツールを介したドライブキャッシュの無効化は、デバイスのリセット時にも失われるため、デバイスが1日の始めにキャッシュを無効にした場合でも、デバイスがリセットされると、ライトバックキャッシュを再度有効にします。別のリセットで、デバイスはデータを失います。

SCSI / SASドライブと一部のsATAドライブには、ライトバックプロファイルの状態を保存して、リセット後もプロパティが失われないようにする機能がありますが、実際にはほとんど使用されません。

ブロックレイヤーを上位レイヤーに統合するRAIDコントローラーは、ドライブのリセットに気付き、ライトバックキャッシュを再び無効にすることができますが、標準のsATAおよびSASコントローラーはこれを行いません。

この制限は、パフォーマンスと信頼性のために構成された他のSET FEATUREおよび同様のパラメーターにも適用されます。


1

あなたが言うように、適切なバッテリーでバックアップされたRAIDコントローラーは高価になりますが、eBayで100ポンド(150ドル)でDell Perc5 / iコントローラーを見つけることができ、特にRAID5ではPerc5 / iのようなコントローラーの速度は驚くでしょう。Perc5 / isと6つのディスクRAID5アレイを備えた複数のサーバーがあり、それらは私が見た中で最速のディスクです。特にデータベースアプリケーションでは、高速ディスクを使用するとパフォーマンスが本当に向上します。

私は弾丸をかみ、RAIDコントローラーを買います。

JR


1

私の知る限り、fsync()の偽造は、ドライブではなく、バッテリーでバックアップされたRAIDコントローラーのプロパティです。RAIDコントローラーには、ドライブの電源が回復し、書き込みがディスクに安全にコミットされるまで、書き込みキャッシュに電力を供給することができるバッテリーが含まれています。これにより、コントローラーは書き込みがディスクに書き込まれることをある程度保証するため、OSにすぐに戻ることができます。

ドライブのライトバックキャッシュがいっぱいになると、キャッシュがドライブに書き戻されるまで書き込みがブロックされることに注意してください。これは、一般的に、持続的な書き込みではキャッシュが効果的でないことを意味します。

アプリケーションに必要なIOPSはいくつですか?ドライブの書き込みキャッシュによって制限されているのか、またはドライブ上の小さな(サーバーのメモリと比較して)が有益であると確信していますか?


私が現在行っているテストは、アプリケーションのパフォーマンスエンベロープを決定し、最適なスケールアップとスケールアウトの方法を見つけることです。ドライブキャッシュは比較的小さい場合がありますが、書き込みキャッシュを使用すると、ドライブは書き込みを並べ替えることができます(適切な場合)。これにより、持続的な書き込みスループットが2倍になります。
eas
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.