iflag=nocache
플래그는 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.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
사용할 때에는 캐시가 여전히 사용 중입니다(빠른 시간 소요로 인해). - 마지막 두 번의 시도에는
iflag=nocache
오랜 시간이 걸렸습니다(즉, 캐시되지 않음). 즉, 미리 읽기 캐시를 사용하지 않았을 가능성이 높으므로 여기서는 미리 읽기 캐시가 문제가 아닐 수도 있습니다. - 이
iflag=nocache
플래그는 이후에 이를 사용하려는 시도가 훨씬 느리기 때문에 작동하는 것으로 보입니다. 이는 캐시가 사용되지 않음을 의미합니다.
노트:
- 위 표의 열에는 두 개의 플래그 와 를 제외하고
dd_flags
에 제공되는 모든 플래그가 표시됩니다 . 해당 열이 있는 행 의 경우 이는 다른 플래그가 없음을 의미합니다( 및 제외 ).dd
if
of
-
dd_flags
dd
if
of
- 입력 파일은
dd
SATA SSD에 저장된 대용량 파일(3.8GB)입니다(최대 처리량은 약 500MB). - 출력 파일
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 플래그도 맨페이지보다 더 자세히 설명되어 있으므로 읽어 볼 가치가 있습니다.