可能なコミットごとに単一のfsyncでジャーナリングを実装するには?

StackOverflow https://stackoverflow.com/questions/3800108

  •  25-09-2019
  •  | 
  •  

質問

レッツは、ジャーナリング/書き込み先行ロギングストレージシステムを構築していると言います。あなたは、単純にfsync-INGの、(書き込み(2)との)データを付加し、その後、マーカーをコミット追加、および(トランザクションごとに)することで、これを実装することができますか?

あなたはそれにfsync、このログへの書き込みの大規模なセットを行う場合は、

は、考慮すべきシナリオがあり、失敗はfsyncをの中にあります。 iノードの直接/間接ブロックポインタは、すべてのデータブロックがフラッシュされ、またはブロックを順番にフラッシュされていることを保証がないだけ後にフラッシュされていますか?もし後者の、あなたはファイルの末尾にマーカーをコミット見れば、リカバリ時に、あなたはそれと前回との間でデータのマーカーが意味があるコミットすることを信頼することはできません。したがって、あなたは一貫して、ログファイルのどの程度を決定するために(少なくとも他のfsyncを含む)別のメカニズムに依存する必要があり(例えば、書き込み/データをfsyncing、そして/コミットマーカーをfsyncing書き込み)ます。

それは違いを作る場合は、主にコンテキストとしてのext3 / ext4の疑問を抱いています。

役に立ちましたか?

解決

のlinuxのとMac OSのfsyncをしてはfdatasyncは、デフォルトでは間違っていることに注意してください。 Windowsは、デフォルトでは正しいのですが、ベンチマークのためのLinuxをエミュレートすることができます。

あなたは、ファイルの末尾に追加ならば、それは新しい長さを持つファイルのinodeを更新する必要があるため、また、はfdatasync問題複数のディスクは、書き込みを行います。あなたがコミットごとに1件の書き込みを持つようにしたい場合は、あなたの最善の策は、ログ・スペースを事前に割り当てマーカーをコミットにログエントリのCRCを格納し、コミットで単一はfdatasync()を発行することです。こうすることで、どんなにあなたの背中の後ろにどのくらいのOS /ハードウェアの追加注文、ログ実際にヒットするディスクのプレフィックスを見つけることができます。

あなたが永続コミットまたは先行書き込みログを使用する場合は、必ずFSYNCが実際に働くことを確認する必要があるため、

、物事は、難しくなります。 Linuxでは、あなたはhdparmのでディスク書き込みキャッシュを無効にする、またはtrueに障壁が設定されたパーティションをマウントすることをお勧めします。 [編集:私は修正立って、障壁は正しい意味を与えていないようです。 SATAおよびSCSIは、先行書き込みログを有効にする輸出プリミティブにシステムを動作させるためにそれを可能にし、このような書き込み障壁とネイティブコマンドキューイングなどのプリミティブ、数を紹介します。私はオンラインのmanページから言うとことができるものから、Linuxのみではないユーザ空間に、これらのファイルシステムに、開発者を公開します。

逆説的に、あなたがユーザ空間での書き込みスケジューリングをより細かく制御を得るために、より良いパフォーマンスに時々リードをディスクの書き込みキャッシュを無効にします。同期書き込み要求の束アップディスクキュー場合は、アプリケーションに奇妙な待ち時間のスパイクを露出させてしまいます。書き込みキャッシュを無効にすると、起きてからこれを防ぐことができます。

最後に、実際のシステムは、グループを使用コミット、および同時のワークロードを1回にコミット<1件の同期書き込みを行います。

他のヒント

ブロックがディスクにフラッシュされる順序に保証はありません。これらの日も、ドライブ自体は、プラッタへの道上のブロックの順序を変更することができます。

あなたが順序を強制したい場合は、

、あなたが注文したいことを書き込む間に少なくともfdatasync()する必要があります。すべての同期の約束があることのそれはの、同期の前に書かれたすべてのものがヒットしているストレージます。

を返すとき
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top