OpenZFS의 중복 제거란 무엇인가?
-
중복 제거의 정의: OpenZFS에서 데이터를 디스크에 쓰기 전에 해당 데이터가 이미 디스크에 존재하는지 확인하고, 존재한다면 새로운 쓰기를 하지 않고 기존 복사본에 대한 참조를 추가하는 것임.
-
중복 제거의 도전 과제: 데이터가 이미 디스크에 있는지 확인하고, 그 위치를 아는 것이 어려움. 이는 추가적인 입출력(IO)을 필요로 하며, 이로 인해 성능 저하가 발생할 수 있음.
중복 제거는 어떻게 작동하는가?
-
작동 방식: 중복 제거가 활성화되면, 데이터 블록이 준비되고 체크섬이 계산됨. 기존에는 메타슬랩 할당자가 공간을 할당했지만, 중복 제거가 활성화되면 체크섬을 중복 제거 테이블에서 조회함.
-
중복 제거 테이블: 체크섬을 키로 사용하고, 디스크 위치와 참조 수를 값으로 사용하는 해시 테이블 형태로 저장됨. 이는 풀 메타데이터의 일부로 간주됨.
전통적인 중복 제거의 문제점
-
중복 제거 테이블의 문제: 전통적인 중복 제거는 OpenZFS의 디스크 해시 테이블 객체를 사용하여 구현됨. 이는 복잡한 구조로, 중복 제거와 같은 응용에는 적합하지 않음.
-
메모리 사용량: 중복 제거 테이블을 읽는 것은 ARC에 캐시되며, 충분한 RAM이 있으면 테이블 업데이트의 읽기 부분을 줄일 수 있음.
-
고유 항목 문제: 중복 제거 테이블에서 고유 항목을 추적하는 데 드는 공간이 문제임. 참조 수가 1인 블록은 중복 제거 테이블에서 공간을 차지하며, 동일한 데이터가 쓰이지 않으면 비용을 회수할 수 없음.
빠른 중복 제거는 어떻게 문제를 해결하는가?
-
라이브 항목 목록 축소: 메모리 사용량을 줄이기 위해 라이브 항목 목록의 메모리 발자국을 줄임. 새로운 중복 제거 테이블은 항목의 "값" 부분이 72바이트로 줄어듦.
-
중복 제거 로그: 라이브 항목 목록을 대신하여 로그를 사용하여 변경 사항을 기록하고, 충돌 복구 시 로그를 재생함. 로그는 메모리에 저장되어 빠른 조회를 가능하게 함.
-
증분 로그 플러싱: 로그의 크기를 관리하기 위해 일부 로그를 매 트랜잭션마다 ZAP에 기록함. 메모리 압박이 있을 때 로그 플러싱을 가속화함.
GN⁺의 정리
- OpenZFS의 새로운 "FastDedup" 기능은 전통적인 중복 제거의 문제점을 해결하기 위해 개발되었음. 메모리 사용량을 줄이고, 로그를 통해 효율적인 데이터 관리를 가능하게 함.
- 중복 제거는 특정 워크로드에서만 유용하며, 일반적인 용도로는 여전히 비효율적일 수 있음. 이는 중복 제거 테이블의 관리 오버헤드가 크기 때문임.
- 비슷한 기능을 가진 다른 프로젝트로는 Btrfs의 중복 제거 기능이 있으며, 이는 다른 파일 시스템에서의 대안이 될 수 있음.