2016-08-01 15 views
1

전원이 끊어지는 경우 디스크의 데이터를 매우 자주 업데이트해야하는 프로젝트가 있습니다. 동일한 길이의 데이터가있는 파일에서 정확히 512b (내 섹터 1 섹터)를 덮어 쓰면 파일 시스템이 변경된 섹터를 표시하고 플러시 할 준비가되면 디스크에서 디스크를 업데이트합니다. 또는 변경 사항이 플러시 될 때마다 전체 파일을 씁니까? 나는 주로 ext4에 관심이 있지만 모든 파일 시스템에서 동일하다면 궁금하다.파일 시스템 : 동일한 길이의 데이터 덮어 쓰기

표준이 변경 사항을 추적하지 않지만 전체 파일을 덮어 쓰려면이 방법을 변경하는 방법이 있습니까? 쓰기 옵션이 있습니까?

답변

1

일반적으로 Linux 파일은 페이지 캐시에 캐시되고 페이지가 더티인지 여부는 페이지 수준에서 추적됩니다. Intel x86 플랫폼에서는 페이지 크기가 4k이므로 4k 페이지를 더럽게 만들면 4k 페이지가 다시 쓰여집니다.

단일 512 바이트 섹터 만 덮어 쓰고 512 바이트 섹터가있는 HDD가있는 경우 O_DIRECT 플래그로 파일을 열 수 있으며 512 바이트 쓰기를 실행하면 파일이 512 바이트의 배수이고, 쓰기 소스가있는 메모리 버퍼도 512 바이트로 정렬 된 다음 페이지 캐시를 무시할 수 있으며 쓰기는 디스크 (즉, O_DIRECT)로 직접 이동합니다.

현대 디스크의 숫자는 실제로 4k 물리적 섹터를 사용하지만 하위 호환성을 위해 512 바이트 섹터를 에뮬레이트합니다. 이 디스크는 512e 섹터라고도합니다 (에뮬레이트 된 경우 e). 이러한 드라이브에서 512 바이트 섹터 쓰기를 수행하면 드라이브가 내부적으로 한 번에 4KB 만 쓸 수 있기 때문에 디스크는 읽기 - 수정 - 쓰기 사이클을 수행합니다. 이것은 성능에 치명적인 영향을 미칠 수 있지만 기능적 관점에서 볼 때 기존의 구식 512 섹터 드 HDD와 동일하게 보입니다.

+0

1MB 파일에서 512b 섹터 중 300b를 썼다면 여전히 하나의 섹터 만 덮어 쓰게됩니까? 덮어 쓸 섹터를 지우기 전에 다른 212b에 대한 읽기만 수행합니까? – Shenanigans

+0

직접 I/O를 사용하는 경우 직접 I/O 읽기를 수행 한 후 직접 I/O 쓰기를 수행해야하며 직접 I/O 작업은 직접 I/O 규칙을 따라야합니다. 512 정렬 된 읽기를 수행하고 300 바이트를 수정 한 다음 직접 I/O 규칙을 따르는 직접 I/O 쓰기를 수행합니다. 따라서 버퍼가 512 바이트 경계에 정렬되어야하고 쓰기가 512 바이트 정렬이어야하며 길이는 512 바이트의 배수 여야합니다. –

+0

버퍼링 된 쓰기를 수행하면 페이지 캐시를 통과하게되며 이는 4k 읽기/수정/쓰기주기를 의미합니다. –