여러 하위 볼륨이 있는 BTRFS 파일 시스템의 중복을 제거하려고 합니다. 총 약 3.5TB의 데이터를 보유하고 있으며, 중복 제거 후에는 그 크기가 절반 이상이 될 것으로 예상됩니다. 내 주요 관심사는 개별 블록이 아닌 중복 파일입니다(그러나 여전히 작은 파일을 중복 제거하고 싶습니다). 파일 크기는 매우 다양합니다. 드라이브는 현재 유지 관리 모드에 있습니다. 이는 중복 제거가 진행되는 동안 파일이 변경되지 않음을 의미합니다.
duperemove
16GB 물리적 메모리, 8GB 스왑 공간을 갖춘 시스템에서 실행됩니다. 데이터 양이 많고 언제든지 중단하고 다시 시작할 수 있기 때문에 해시 파일을 사용합니다.
내 초기 실행은 기본 블록 크기를 사용했습니다. 인덱싱을 완료하는 데 약 28일이 걸렸습니다(21GB 해시 파일 생성). 그 후 시스템은 메모리에 중복 해시를 로드하는 데 8일을 더 소비한 후 메모리가 거의 완전히 부족해 응답하지 않게 되었습니다. ( duperemove
메모리 사용량은 대부분 12~14GB 사이에서 변동했지만 시스템의 어떤 프로세스에서도 메모리 사용량이 증가한 것을 볼 수는 없지만 메모리는 계속 채워집니다.)
추가 메모리를 추가하는 옵션은 제한되어 있습니다. 제가 선택할 수 있는 유일한 방법은 USB 드라이브에 추가 스왑 공간을 추가하는 것이었습니다. 이로 인해 이미 값비싼 스왑 메커니즘에 성능 저하가 추가되었습니다. 그래도 부족함을 방지하기 위해 이런 방식으로 스왑 공간을 32GB 더 추가했습니다.
그러나 나는 다른 블록 크기를 사용해 본 적이 없습니다(FAQ에는 이에 대한 정보가 거의 없습니다). 기본적으로 내 질문은 다음과 같습니다.
- 메모리 부족을 방지하려면 블록 크기를 어떻게 선택해야 합니까?
- 우수한 중복 제거 비율을 유지하면서 최고의 성능을 얻으려면 블록 크기를 어떻게 선택해야 합니까? (테스트 실행을 위해 또 한 달을 기다리고 싶지는 않지만 1~2GB의 디스크 공간을 낭비할 여유가 있습니다.)
- 스와핑으로 인한 성능 저하는 무엇입니까? 스와핑이 필요하지 않도록 메모리 사용량을 줄이는 데 도움이 됩니까, 아니면 스와핑하지 않는 것의 이점이 다른 것으로 상쇄됩니까?
- 다른 블록 크기로 생성된 기존 해시 파일을 재사용할 수 있나요? 그렇다면 모든 것이 이미 해시된 경우 블록 크기를 변경하면 영향을 미치나요?
답변1
완전한 답변은 아니지만 블록 크기에 대해: 테스트 데이터 세트에서 64K 블록 크기의 중복 제거가 여전히 합리적인 시간 내에 완료되었음을 발견했습니다. 4K는 작은 장면에는 적합하지만 큰 장면에는 적합하지 않습니다. 300-500G의 데이터 세트의 경우 16K의 블록 크기가 잘 작동하지만 8K에서는 성능이 크게 떨어집니다.
블록 크기를 조정하기 전에 스캔하려는 데이터의 양을 줄이십시오. 이것이 리소스를 절약하는 가장 좋은 방법입니다.
- 스냅샷이 여러 개인 경우(모두 중복 제거되었거나 읽기 전용) 스냅샷을 모두 스캔해도 아무런 이점이 없습니다. 하나만 있으면 충분합니다. 가장 최신이거나 가장 오랫동안 유지하고 싶은 것이 바람직합니다.
- 중복이 있을 위치(예: 대부분 동일한 경로)에 대한 대략적인 예상이 있는 경우 파일 시스템을 더 작은 부분으로 나누어 "부분 간" 중복을 최소화하고 부분 중복별로 제거하십시오. 많은 반복이 예상되지 않는 섹션을 제외하세요.
마지막으로 테스트해 보세요. 128K(기본값)로 시작하고 거기에서 위아래로 작업합니다(매번 새 해시 파일 사용). 완료 시간이 여전히 허용 가능하고 메모리가 부족하지 않으면 더 작은 블록 크기(반 또는 1/4)를 사용합니다. ) 이전 기사의 내용을 반복합니다). 너무 많은 시간이나 메모리가 필요한 경우 중단하고 블록 크기를 2~4배 늘립니다. 취할 수 있는 가장 낮은 값은 기본 파일 시스템의 블록 크기입니다 stat -f /path/to/mountpoint
(btrfs의 기본 블록 크기는 4K입니다).
동일한 데이터 세트에 대해 여러 실행을 수행하는 경우: 더 큰 청크가 이미 중복 제거되었으므로 두 번째 및 후속 실행은 더 빨리 완료되고 메모리를 덜 사용하지만 드라이브 공간도 절약됩니다.