dd에서 oflag=direct와 conv=f​​sync를 동시에 사용할 수 있나요?

dd에서 oflag=direct와 conv=f​​sync를 동시에 사용할 수 있나요?

내 대상 장치는 4096bs 하드 드라이브입니다. 캐시를 우회하고 스토리지에 직접 또는 최대한 빨리 쓰고 싶습니다. 속도는 나의 가장 큰 관심사가 아닙니다. 30시간은 너무 많지만 4시간과 7시간의 차이는 무시할 수 있습니다.


내 이해(100% 정확하지 않을 수 있음):

conv=fsync호출이 끝날 때 한 번만 실행됩니다 dd.

하지만 동기화를 끝까지 미루고 싶지는 않습니다. 가능한 한 빨리 데이터를 스토리지에 기록하고 싶습니다. 두 가지 다른 옵션이 있습니다: oflag=directoflag=sync. oflag=sync(1) 테스트했을 때 속도가 매우 느리고 (2) 여전히 메모리 캐싱을 사용하기 때문에 마음에 들지 않습니다 bs=4096. 이는 불필요하다고 생각합니다.

oflag=direct커널의 페이지 캐시(메모리 캐시)를 우회하고 스토리지에 직접 씁니다. 하지만 스토리지 자체가 HDD(후기입) 캐시에 데이터를 저장할 수 있으므로 conv=fsyncHDD 캐시는 여전히 실제 스토리지에 기록되어야 합니다.

그래서 저는 다음과 같이 이 두 매개변수를 함께 사용하는 것이 이상적인지 궁금합니다.

dd if=/dev/zero of=/dev/sdX bs=4096 status=progress oflag=direct conv=fsync

답변1

문제는 속도에 관한 것 같습니다. 이미 사용하고 계시 conv=fsync므로 보안이나 "정확성" 문제는 없다고 생각합니다. 하드웨어에 특정 버그가 있는 경우를 제외하고 버그가 어떻게 생겼는지 정확하게 알려주셔야 합니다.

성능에 대한 일반적인 규칙은 자신의 상황을 테스트하고 작은 차이에 대해 너무 걱정하지 않는 것입니다. dd속도를 알려주세요. count=예를 들어 400M을 사용하여 쓰기를 테스트할 수 있습니다 bs=4k count=100k.


비교적 간단한 경우에 대해 질문하고 있습니다. /dev/zero장치보다 훨씬 빠르므로 읽기 성능은 무시합니다.

를 사용하면 oflag=sync각 데이터 블록이 커밋된 후 모든 임시 캐시가 지워질 때까지 기다리므로 항상 데이터 전송을 유지하는 이점을 잃게 됩니다. 따라서 최상의 속도를 위해서는 더 큰 블록 크기를 지정해야 합니다(예: bs=16M.

원칙적으로 장치에는 한 번에 최대 2개의 요청을 처리하여 처리할 요청이 항상 최소한 하나 이상 있도록 하려고 합니다. 특히 기계식 드라이브의 경우 피드가 마르도록 방치하면 다음 요청이 올바른 위치에 기록되기 전에 완전히 회전할 때까지 기다려야 합니다. dd이를 보장하기 위해 자체적으로는 아무 것도 수행하지 않습니다. 커널이나 장치의 후기입 캐시에 의존합니다.

oflag=direct유용한 중간 옵션입니다. 커널 캐시 문제가 있는 경우(아래 참조) 이는 캐시를 우회하는 좋은 방법입니다. 많은 장치에는 자체 후기입 캐시가 포함되어 있으므로 oflag=direct동일한 블록 크기의 장치보다 빠릅니다.oflag=sync

커널 캐시는 IO 액세스 속도를 늦추지 않고 제대로 작동하도록 설계되었습니다.다른장비. 예를 들어 동시에 사용하는 시스템 드라이브 :-). 그러나 이 문제는 때때로 발생하며 사람들은 이에 대해 불평합니다. 따라서 이러한 문제에 대해 예상하거나 걱정하는지에 따라 달라질 수 있습니다. :-).

두 옵션을 모두 시도하려면 으로 지정하십시오 oflag=direct,sync.

그렇지 않더라도 oflag=sync블록 크기를 몇 번 더 늘리면 CPU 사용량이 줄어들 수 있습니다. 예를 들어 bs=16k또는 bs=1M. 하지만 bs=4k/는 bs=4096이미 상당히 훌륭합니다. 고대의 기본값보다 훨씬 낫습니다 bs=512.

답변2

귀찮게 하지 않겠 dd습니다. 타이핑 속도가 너무 느려요.최대화하다출력이 매우 느리기 때문에 캐싱이 사용되지 않습니다. 더 많은 캐시를 사용하기 위해 청크 크기를 사용하는 것이 가장 좋습니다.

@sgon00의 특정 질문과 관련하여 dd맨페이지에는 다음과 같이 나와 있습니다.

fdatasync     physically write output file data before finishing            
fsync         likewise, but also write metadata

oflag=FLAGS   write as per the comma separated symbol list...

oflag=캐시 없음캐시 삭제를 요청하세요. 이 옵션은 최소한 캐싱을 언급합니다. 그러나 이것이 반드시 승인된다는 의미는 아닙니다. 이는 Direct 옵션과 결합될 수 있습니다.

dd오래된 프로그램이므로 가능한 많은 인수가 원래 의도한 대로 정확하게 해석되지 않을 수 있습니다.

관련 정보