다음과 같은 쉘 스크립트가 있는데 이것이 맞는지 알고 싶습니다.초과분~의직접~이든동기화자동으로 또는 명시적으로 요청됨:
dd bs=10M oflag=direct,sync of=ofile.bin
차이점이 뭐야?oflag=동기화그리고전환=동기화그리고변환=fsync?
코드를 다음 줄로 변경하면 어떤 영향을 미치나요?
dd bs=10M conv=fsync oflag=direct of=ofile.bin
답변1
conv=sync
우리는 이것을 처음부터 배제 할 수도 있습니다 . 그것은 꽤 다른 일을 합니다. 나는 당신이 원하지 않기를 바랍니다 :-).
block 또는 unblock과 함께 사용하는 경우 NUL을 사용하여 각 입력 블록을 ibs 크기로 채우고 NUL 대신 공백으로 채웁니다.
oflag=direct
자동으로 동기화되지 않습니다. [*]
conv=fsync
와 다릅니다 oflag=sync
. oflag=sync
각 출력 블록 이후 효과적인 동기화. conv=fsync
마지막 동기화입니다.
최종 결과는 동일하지만 그 과정에서의 성능은 다릅니다 :-).
oflag=sync
상당히 느려질 수 있습니다. 블록 크기를 늘려 이 문제를 완화할 수 있습니다.장치별 캐시가 큰 경우[1] 옵션에 의해 보고되는 진행 상황에 영향을 미칩니다
status=progress
.당신이 그렇게한다면아니요사용하는 경우
oflag=direct
시스템 페이지 캐시에 많은 수의 쓰기 작업이 누적될 수 있습니다. 이 누적은 표시되는 진행 상황에 영향을 미칩니다[2]. 또한 Linux는 때때로 빌드에 제대로 반응하지 않고 성능을 저하시킵니다.모두장치[3].
[1] "분명히 귀하의 하드웨어에는 수백 메가바이트의 캐시가 있습니다... 제 경우에는 커널이 [실제로 가상 머신 내부에서 실행되기 때문입니다]".https://unix.stackexchange.com/a/420300/29483
[2]dd 파이프라인에 대한 gunzip이 느려지는 이유는 무엇입니까?
[삼]외부 디스크에서 과도한 읽기 및 쓰기 작업을 수행할 때 시스템이 지연됩니다.
[*]블록 장치 노드에 직접 쓰는 경우, Linux는 블록 장치가 닫힐 때(그리고 다른 프로그램에서 열리지 않을 때) 블록 장치를 동기화합니다. 바라보다:블록 장치 캐싱 및 파일 시스템. 블록 장치에 쓸 때 명시적인 동기화를 사용하지 않는 사람들을 가끔 봅니다. 종종 잘 작동하는 것처럼 보이지만... 그렇지 않을 때까지 말이죠. 따라서 최소한 conv=fsync
.