22장. 쓰기 Barriers
쓰기 장벽 은 휘발성 쓰기 캐시를 사용하는 스토리지 장치에 전원을 잃은 경우에도 파일 시스템 메타데이터를 올바르게 작성하고 영구 스토리지에 정렬하도록 하는 데 사용되는 커널 메커니즘입니다. 쓰기 장벽이 활성화된 파일 시스템은 fsync() 를 통해 전송되는 데이터가 정전 전체에 영구적으로 유지됩니다.
쓰기 장벽을 활성화하면 일부 애플리케이션에 상당한 성능 저하가 발생합니다. 특히 fsync() 를 많이 사용하거나 많은 작은 파일을 만들고 삭제하는 애플리케이션이 훨씬 느려질 수 있습니다.
22.1. 이메일 주소
파일 시스템은 메타데이터를 안전하게 업데이트하여 일관성을 보장합니다. journalled 파일 시스템은 메타데이터 업데이트를 트랜잭션에 번들하고 영구 스토리지로 보냅니다.
- 파일 시스템은 트랜잭션의 본문을 스토리지 장치로 전송합니다.
- 파일 시스템은 커밋 블록을 보냅니다.
- 트랜잭션과 해당 커밋 블록이 디스크에 기록되면 파일 시스템은 트랜잭션이 전원 실패로 유지되는 것으로 가정합니다.
그러나 전원 장애 중에 파일 시스템 무결성은 추가 캐시가 있는 스토리지 장치에 대해 더 복잡해집니다. 로컬 S-ATA 또는 SAS 드라이브와 같은 스토리지 대상 장치에는 크기가 32MB에서 64MB까지의 쓰기 캐시가 있을 수 있습니다(현장 드라이브 사용). 하드웨어 RAID 컨트롤러에는 내부 쓰기 캐시가 포함된 경우가 많습니다. 또한 NetApp, IBM, Hitachi 및 EMC(다른 특성상)의 상위 엔드 어레이에도 대규모 캐시가 있습니다.
쓰기 캐시가 있는 스토리지 장치는 데이터가 캐시에 있을 때 "완전"으로 "완전"으로 보고됩니다. 캐시의 전원이 끊어지면 해당 데이터도 손실됩니다. 캐시가 영구 스토리지에 대한 단계이므로 원래 메타데이터 순서가 변경될 수 있습니다. 이 경우, 커밋 블록이 완전한 관련 트랜잭션 없이도 디스크에 존재할 수 있습니다. 결과적으로 저널은 이러한 초기화되지 않은 트랜잭션 블록을 post-power-loss recovery 중에 파일 시스템으로 재생할 수 있으므로 데이터가 일관되고 손상될 수 있습니다.
22.1.1. Barriers의 작업 방법
쓰기 장벽은 순서가 중요한 I/O 이전과 이후에 스토리지 쓰기 캐시 플러시를 통해 Linux 커널에서 구현됩니다. 트랜잭션을 작성한 후에는 스토리지 캐시가 플러시되고, commit 블록이 기록되고 캐시가 다시 플러시됩니다. 이렇게 하면 다음을 수행할 수 있습니다.
- 디스크에는 모든 데이터가 포함됩니다.
- 재주문이 발생하지 않았습니다.
장벽이 활성화되면 fsync() 호출에서 스토리지 캐시 플러시를 발행합니다. 이렇게 하면 fsync() 가 반환하는 직후 전원 손실이 발생하는 경우에도 파일 데이터가 디스크에 영구적으로 유지됩니다.