第22章 書き込みバリア
書き込みバリアは、揮発性の書き込みキャッシュを備えたストレージデバイスの電源が切れた場合でも、ファイルシステムのメタデータが永続ストレージに正しく書き込まれ、順序付けられるようにするために使用されるカーネルメカニズムです。書き込みバリアが有効になっているファイルシステムにより、fsync () を介して送信されるデータは、電源の損失後も持続します。
書き込みバリアを有効にすると、アプリケーションによってはパフォーマンスが大幅に低下する場合があります。具体的には、fsync () を頻繁に使用するか、多くの小さなファイルを作成および削除するアプリケーションは、はるかに遅くなります。
22.1. 書き込みバリアの重要性
ファイルシステムはメタデータを安全に更新し、整合性を確保します。ジャーナル化されたファイルシステムは、メタデータの更新をトランザクションにバンドルし、次の方法で永続ストレージに送信します。
- ファイルシステムは、トランザクションの本文をストレージデバイスに送信します。
- ファイルシステムは、コミットブロックを送信します。
- トランザクションとそれに対応するコミットブロックがディスクに書き込まれる場合、ファイルシステムは、トランザクションが電源障害に耐えられると想定します。
ただし、電源障害時のファイルシステムの整合性は、キャッシュが余分にあるストレージデバイスでは複雑になります。ローカルの S-ATA や SAS ドライブのようなストレージターゲットデバイスには、32MB から 64MB のサイズの書き込みキャッシュがある場合があります (最新のドライブを使用する場合)。ハードウェア RAID コントローラーには、多くの場合、内部書き込みキャッシュが含まれます。さらに、Net App、IBM、Hitachi、EMC などのハイエンドアレイにも大きなキャッシュがあります。
書き込みキャッシュがあるストレージデバイスは、データがキャッシュにあると I/O を完了と報告します。キャッシュが電力を失うと、そのデータも失われます。さらに悪いことに、キャッシュが永続ストレージにデステージされると、元のメタデータの順序が変更される可能性があります。これが発生すると、完全に関連付けられたトランザクションがない状態で、コミットブロックがディスクに存在する可能性があります。その結果、ジャーナルは、電力損失からの復旧中に、初期化されていないトランザクションブロックをファイルシステムに再生する場合があります。これにより、データの不整合や破損が発生する可能性があります。
書き込みバリアのしくみ
書き込みバリアは、I/O の前後でストレージの書き込みキャッシュフラッシュを介して Linux カーネルに実装されます。これは 順序が重要 となります。トランザクションが書き込まれた後、ストレージキャッシュがフラッシュされ、コミットブロックが書き込まれ、キャッシュが再度フラッシュされます。これにより、以下が確保されます。
- ディスクに、すべてのデータが含まれている。
- 順序の並べ替えは発生していません。
バリアを有効にすると、fsync () 呼び出しにより、ストレージキャッシュフラッシュも発行されます。これにより、fsync () が返された直後に電源の損失が発生した場合でも、ファイルデータがディスク上の永続化されるようになります。