iflag=nocache
フラグはdd
2番目以降にのみ適用されるようです。
理由がわからない。
これは先読みキャッシュに関連している可能性があると思いましたが、次の表に結果は記載されていません。
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
に提供されているすべてのフラグが表示されます。その列がある行の場合、これは他のフラグがないことを意味します(および除外)。dd
if
of
-
dd_flags
dd
if
of
- 入力ファイルは
dd
SATA 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
関連内容を読んでも問題は解決しませんでした。
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フラグもマンページより詳細に説明されているので、読む価値があります。