フラグを使用しないと、ループデバイスに関連する2つのキャッシュがあることを理解しています。ループデバイス内のファイルシステムに書き込むときにページキャッシュになり、基になるファイルのファイルシステムに書き込むときに再びページキャッシュになります。あれは正しいですか?
Direct-IOのドキュメントによると
--direct-io[=on|off]
バッキングファイルの直接I/Oを有効または無効にします。オプションの引数は、オンまたはオフのいずれかです。引数を省略すると、デフォルトでオンになります。
これは、このオプションでは、単一のキャッシュ、つまり基になるファイルのファイルシステムのキャッシュしかないことを意味しますか?
-o sync
のドキュメントには、
-o sync
ファイルシステムへのすべてのI/Oは同期的に実行する必要があります。書き込みサイクル数が制限されているメディア(一部のフラッシュドライブなど)の場合、同期によってライフサイクルが短くなる可能性があります。
過去に、ループマウントでのsync
ファイルシステムで深刻なパフォーマンスの問題があり、ライフサイクルの短縮に関する警告に基づいていたため、これは、基になるファイルについても、キャッシュがなくなったことを意味します。データはハードウェアに直接書き込まれます。
これは正しいですか、それとも問題がより複雑ですか?
免責事項:これは100%正確ではない可能性があります。私の理解です。
一般に、ファイルを開くときは、O_SYNCまたはO_DIRECTを使用できます。
同期とは、書き込みのたびにデータがディスクに同期されることを意味します。それはおそらく意味します:ユーザースペースからカーネルスペースにコピーし、次にfsで同期を実行します。最終的には、最下部まで同期した後、ディスクで何らかの同期を実行します。
Direct-ioは、データがディスクに直接書き込まれ、可能な場合は内部バッファーをバイパスすることを意味します。
違い:
注:物事のレイヤーの上にレイヤーがある、より複雑なセットアップ(例:ハードディスク->ソフトウェアレイド->暗号化-> lvm->ファイルシステム)では、同期はハードウェアまでずっと伝わります。
Direct-ioを使用してループバックデバイスをマウントすると、次のようになります。