web-dev-qa-db-ja.com

Linuxで「バリア」マウントフラグは何を意味しますか?

「バリア」マウントオプションのマニュアルは次のとおりです。

バリア= 0 /バリア= 1

これにより、jbdコードでの書き込みバリアの使用が無効/有効になります。barrier= 0は無効になり、barrier = 1は有効になります(デフォルト)。これには、バリアをサポートできるIOスタックも必要です。jbdがバリア書き込みでエラーを取得した場合、警告でバリアを再び無効にします。書き込みバリアは、ジャーナルのディスク上の適切な順序を強制しますコミットして、揮発性ディスク書き込みキャッシュを安全に使用できるようにします。パフォーマンスが低下します。ディスクが何らかの方法でバッテリーバックアップされている場合は、バリアを無効にすると、パフォーマンスが安全に向上します。

しかし、「ディスク上のジャーナルコミットの適切な順序」という文の意味がわかりません。

通常の順序と仮定します-ジャーナル1、データ1;ジャーナル2、データ2。
barrier=0を設定すると、次の注文結果のどれが発生しますか?

  1. ジャーナル2、データ2;ジャーナル1、データ1;
  2. データ1、ジャーナル1。データ2、ジャーナル2。
22
leafonsword

最近のほとんどのファイルシステムはジャーナリングファイルシステムです。つまり、ディスクにまだ書き込まれていない変更を、ジャーナルと呼ばれる内部データ構造で追跡します。クラッシュが発生した場合、このジャーナルが再生され、すべての書き込みが正常に実行され、ファイルの破損が防止されます。

実際にデータをディスクに書き込むとき、書き込みキャッシュは書き込みを再順序付けしてスループットを最大化しようとしますが、実際のファイルデータがメタデータの前にディスクに書き込まれていることを確認して、クラッシュした場合にメタデータがデータで古くなることはありません。

問題は、多くのディスクに独自のキャッシュがあり、書き込みも並べ替えられる可能性があることです。一部のファイルシステムは、これが発生すると想定し、特定のポイントでディスクにキャッシュをフラッシュさせ、これを防止します。これは、たとえばwrite barriersと呼ばれます。 ext4、およびLinux全般。

最近のディスクの場合、これを行うためのパフォーマンスの犠牲はごくわずかであり、絶対に必要でない限り、書き込みバリアを無効にしないでください。

16
kyrias

このLWN記事 から:

ファイルシステムのコードは、[ジャーナリング]コミットレコードを書き込む前に、トランザクションのすべての情報がジャーナルに到達したことを確実に確認する必要があります。適切な順序で書き込みを行うだけでは不十分です。最新のドライブは大きな内部キャッシュを維持し、パフォーマンスを向上させるために操作を並べ替えます。したがって、ファイルシステムは、コミットレコードを書き込む前に、すべてのジャーナルデータをメディアに取得するようにディスクに明示的に指示する必要があります。コミットレコードが最初に書き込まれる場合、ジャーナルが破損している可能性があります。カーネルのブロックI/Oサブシステムでは、バリアを使用してこの機能を利用できます。本質的に、バリアは、バリアの前に書き込まれたすべてのブロックがメディアにコミットされるまで、バリアの後のブロックの書き込みを禁止します。バリアを使用することにより、ファイルシステムは、ディスク上の構造が常に一貫性を保つようにできます。

2
qinganfan