多くの IO シナリオでは、多くの場合、システムがクラッシュした後でも読み取れるように、データがディスクに安全に書き込まれていることを確認する必要があります。データを再起動します。しかし、Linux システムの IO パスは依然として非常に複雑で、多くの層に分割されていることは誰もが知っており、各層には IO の読み取りと書き込みを高速化するためのバッファーが含まれている場合があります。同時に、ユーザー モード アプリケーションとライブラリ関数にも独自のバッファがある場合があり、これにより IO パスが若干複雑になります。データをディスクに安全に書き込むには、単に write/fwrite を調整するだけでは不可能であることがわかります。 ###### じゃあ何をすればいいの?多くの人は、O_DIRECT または O_SYNC フラグを使用した fflush()、fsync()、fdatasync()、sync()、open() など、さまざまな方法を考えるでしょう。さて、これらの手段 (またはいくつかの組み合わせ) により、実際にデータの安全な永続性が保証されます。では、それらの違いは何でしょうか? fflush() と fsync() の違いは何ですか? O_DIRECT とは何を意味しますか? データの安全な永続性を確保できますか? O_DIRECT と O_SYNC の違いは何ですか? O_SYNC と fsync() についてはどうですか? fsync は msync の機能を完了できますか?この記事では、これらの概念の機能と違いを理解して説明します。
Linux IO
## ここでは、O_DIRECT と O_SYNC に焦点を当てます。まず、O_DIRECT は、データがページ キャッシュ (通常はユーザー モードで使用される) を経由しないことだけを意味することを明確にする必要があります。バッファを管理するため)、ブロック デバイス層に直接送信しますが、データがディスクに安全に書き込まれるまで同期的に待機せずに戻ります (たとえば、データはまだブロック層またはディスク自体のキューに入れられている可能性があります)キャッシュ)。 O_SYNC フラグに関しては、データは引き続きページ キャッシュに書き込まれますが、この時点ではライト スルー戦略が採用され、データがディスクに安全に書き込まれるまでデータは同期的に返されます。したがって、O_DIRECT と O_SYNC を同時に使用すると、データはページ キャッシュを経由せず、データがディスクに安全に書き込まれるのを待ってから戻ります。当然、IO パフォーマンスは非常に高くなります。低い。
O_DIRECT はページキャッシュをバイパスするため、他のプロセスが通常の方法でファイルを読み込むと、データの不整合が発生する可能性がありますので、これにも注意が必要です。 補足説明として、議論中に読んだ情報をここに掲載します。 1 つ目は、open システム コールを引用することです:http://man7.org/linux/man-pages/man2/open.2.html
関連パラメータの説明: # そして innodb 関連ドキュメント:https://lwn.net/Articles/457667/
fsync と fdatasync の違い:http://man7.org/linux/man-pages/man2/fsync.2.html
msync:http://man7.org/linux/man-pages/man2/msync.2.html
実際には、DAX (Direct Access) という別の IO モードがあります。これは O_DIRECT に似ていますか?このモードは、ファイル システムとブロック ドライバーの両方からのサポートを必要とします。一般に、不揮発性メモリで使用されます。本質的に、ページ キャッシュをバイパスし、デバイスを直接操作します。この記事では DAX については詳しく説明しません。後で、DAX モードをサポートする RAM ディスク ブロック デバイス ドライバーを作成し、それを ext4 ファイル システムにフォーマットして -o dax モードでマウントし、DAX の IO パスを調べます。詳細。
その他の Linux 記事については、Linux チュートリアル 列にアクセスして学習してください。
以上がLinux で安全なデータ転送を確保する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。