dd: `iflag=nocache` を初めて使用する場合は無効です。

dd: `iflag=nocache` を初めて使用する場合は無効です。

iflag=nocacheフラグはdd2番目以降にのみ適用されるようです。
理由がわからない。
これは先読みキャッシュに関連している可能性があると思いましたが、次の表に結果は記載されていません。

Results - Effect of iflag=nocache: from big SATA SSD file to /dev/null:
Test_Name                dd_flags       Time[s]  time/dd exit status
w/ iflag=nocache         iflag=nocache  6.95     0
again w/ iflag=nocache   iflag=nocache  6.94     0
first w/o iflag=nocache  -              6.94     0
2nd w/o iflag=nocache    -              2.60     0
3nd w/o iflag=nocache    -              2.49     0
first w/ iflag=nocache   iflag=nocache  2.71     0
2nd w/ iflag=nocache     iflag=nocache  6.94     0
3rd w/ iflag=nocache     iflag=nocache  6.94     0

下位3つのテスト/行について:

  • 初めてiflag=nocache使用するときは、キャッシュはまだ使用中です(高速な時間がかかるため)。
  • 最後の2回の試みにはiflag=nocache長い時間がかかりました(つまり、キャッシュされていません)。つまり、先読みキャッシュを使用していない可能性が高いため、ここでは先読みキャッシュが問題ではない可能性があります。
  • このiflag=nocacheフラグは、後で使用する試みがはるかに遅いために機能するようです。これはキャッシュが使用されないことを意味します。

メモ:

  • 上の表の列には、2つのフラグとを除いてdd_flagsに提供されているすべてのフラグが表示されます。その列がある行の場合、これは他のフラグがないことを意味します(および除外)。ddifof-dd_flagsddifof
  • 入力ファイルはddSATA SSDに保存されている大容量ファイル(3.8 GB)です(最大スループットは約500 MB)。
  • 出力ファイルddは/ dev / nullです。
  • 上の表の列は、Bash予約語の結果でTime[s]ある「realtime」です。time
  • 不要なので同期は行いません。ファイルは、コンピュータの起動前に記録されます。
  • echo 1 >|/proc/sys/vm/drop_cachesキャッシュが完全に無効になるのを防ぐために、OSページキャッシュを消去しません(使用)。

示されているように、ファイル全体のキャッシュを削除してみました。info ddうまくいくようです。

Results - Effect of iflag=nocache: from big SATA SSD file to /dev/null:
Test_Name                  dd_flags               Time[s]  time/dd exit status
w/ iflag=nocache           iflag=nocache          6.95     0
again w/ iflag=nocache     iflag=nocache          6.95     0
first w/o iflag=nocache    -                      6.94     0
2nd w/o iflag=nocache      -                      2.60     0
3nd w/o iflag=nocache      -                      2.49     0
Drop cache for whole file  iflag=nocache,count=0  0.14     0
first w/ iflag=nocache     iflag=nocache          6.94     0
2nd w/ iflag=nocache       iflag=nocache          6.94     0
3rd w/ iflag=nocache       iflag=nocache          6.94     0

バージョン:

$ dd --version | head -1
dd (coreutils) 8.32

関連内容を読んでも問題は解決しませんでした。

dd「直接」対「キャッシュなし」

https://www.gnu.org/software/coreutils/manual/html_node/dd-inspiration.html#dd-invocation

ベストアンサー1

キャッシュを削除しているのでしょうかiflag=nocache...後ろに以前読んだことがありません。

straceを使用すると、次のことがわかります。

# strace dd iflag=nocache … |& grep -Pi 'read|dontneed'
[…]
read(0, "\0"..., 65536) = 65536
read(0, "\0"..., 65536) = 65536
fadvise64(0, 393216, 131072, POSIX_FADV_DONTNEED) = 0
read(0, "\0"..., 65536) = 65536
read(0, "\0"..., 65536) = 65536
fadvise64(0, 524288, 131072, POSIX_FADV_DONTNEED) = 0
read(0, "\0"..., 65536) = 65536
read(0, "\0"..., 65536) = 65536
fadvise64(0, 655360, 131072, POSIX_FADV_DONTNEED) = 0
[…]

POSIX_FADV_DONTNEED各読み取りの後には、以前に読み取った内容を含む範囲があります。

POSIX_FADV_DONTNEED は、dd で使用されるブロックサイズとは異なるソートが必要なため、読み取りとまったく一致しません。しかし、最終的には、以前に読み込まれたブロックのキャッシュを破棄します。

したがって、キャッシュされていないデータを読み取ることが目的であれば、このiflagは役に立ちません。 (*)

代わりに、読み込んだコンテンツをキャッシュしたり、以前にキャッシュされた他のコンテンツを置き換えたりすることはありません。これは、既存のキャッシュをあまり妨げることなく大容量ファイルをコピーまたはストリーミングする方法です。

man 2 posix_fadvise次のように説明します。

POSIX_FADV_DONTNEED
指定されたデータは近いうちにアクセスされません。

POSIX_FADV_DONTNEED指定された領域に関連付けられたキャッシュされたページを解放しようとします。たとえば、大容量ファイルをストリーミングする場合に便利です。プログラムは、使用されたキャッシュデータを解放するようにカーネルに定期的に要求して、有用なキャッシュページを破棄しないようにすることができます。

部分ページ削除要求は無視されます。不要なデータを破棄するよりも、必要なデータを保持する方が良いです。アプリケーションから削除されたデータを考慮する必要がある場合は、offsetとlenをページ整列する必要があります。

したがって、すでに使用されていますが(すでにddから読み取られている)、より有用な情報を捨てないようにキャッシュに保存されていないデータについてです。


(*)

info ddこの例は、ファイルを読み取らずにファイル全体のキャッシュを削除する方法としてリストされています。

dd if=ifile iflag=nocache count=0

nocacheフラグもマンページより詳細に説明されているので、読む価値があります。

おすすめ記事