web-dev-qa-db-ja.com

ループデバイスのdirect-IO( "losetup --direct-io")と "mount -o sync"の違いは何ですか?

フラグを使用しないと、ループデバイスに関連する2つのキャッシュがあることを理解しています。ループデバイス内のファイルシステムに書き込むときにページキャッシュになり、基になるファイルのファイルシステムに書き込むときに再びページキャッシュになります。あれは正しいですか?

Direct-IOのドキュメントによると

--direct-io[=on|off]バッキングファイルの直接I/Oを有効または無効にします。オプションの引数は、オンまたはオフのいずれかです。引数を省略すると、デフォルトでオンになります。

これは、このオプションでは、単一のキャッシュ、つまり基になるファイルのファイルシステムのキャッシュしかないことを意味しますか?

-o syncのドキュメントには、

-o syncファイルシステムへのすべてのI/Oは同期的に実行する必要があります。書き込みサイクル数が制限されているメディア(一部のフラッシュドライブなど)の場合、同期によってライフサイクルが短くなる可能性があります。

過去に、ループマウントでのsyncファイルシステムで深刻なパフォーマンスの問題があり、ライフサイクルの短縮に関する警告に基づいていたため、これは、基になるファイルについても、キャッシュがなくなったことを意味します。データはハードウェアに直接書き込まれます。

これは正しいですか、それとも問題がより複雑ですか?

免責事項:これは100%正確ではない可能性があります。私の理解です。

一般に、ファイルを開くときは、O_SYNCまたはO_DIRECTを使用できます。

同期とは、書き込みのたびにデータがディスクに同期されることを意味します。それはおそらく意味します:ユーザースペースからカーネルスペースにコピーし、次にfsで同期を実行します。最終的には、最下部まで同期した後、ディスクで何らかの同期を実行します。

Direct-ioは、データがディスクに直接書き込まれ、可能な場合は内部バッファーをバイパスすることを意味します。

違い:

  • キャッシュは引き続き同期で使用され、読み取りを高速化できます。また、追加のメモリコピーが必要です
  • 同期により、ほぼ確実に何らかのディスク同期が発生します。つまり、他のパーティションのデータも同期されます(「同期」を使用して1つのパーティションのみをマウントし、「同期」を使用せずに他のパーティションをマウントした場合があるため)
  • Direct-ioは自動同期しないと思います。つまり、(a)他のパーティションからのデータは同期されず、(b)ドライブの内部キャッシュはフラッシュされません。
  • 512バイトの倍数を使用するようないくつかの他のもの

注:物事のレイヤーの上にレイヤーがある、より複雑なセットアップ(例:ハードディスク->ソフトウェアレイド->暗号化-> lvm->ファイルシステム)では、同期はハードウェアまでずっと伝わります。

Direct-ioを使用してループバックデバイスをマウントすると、次のようになります。

  • キャッシュはループバックデバイスには使用されません(ただし、スタックの残りの部分には使用されます)
  • データは暗黙的にディスクに同期されないため、パフォーマンスが向上します
  • あなたは記憶を無駄にしません
1
V13