TL; DR
Btrfs의 조각 모음 기능은 폴더 메타 데이터 및 파일 내용의 조각화를 수정하는 데 고유 한 반면, 균형 기능은 드라이브를 추가하거나 제거 할 때마다 드라이브간에 공유되는 데이터의 양 을 " 밸런스 "(이름)하기 위해 만들어졌습니다 . 그것들은 그들이하는 것과 이론적으로 겹치는 부분이 있지만, 그것들은 직접적으로 관련이 없기 때문에 문서는 두 기능을 연결하지 않습니다.
자세한 답변은 아래를 참조하십시오. 물론 저의 긴 대답은 직면 한 문제에 대한 완전한 맥락을 갖지 못하는 다른 사람들을 도울 것이라는 희망에 있습니다.
청크 할당
btrfs의 중요한 개념은 청크 할당입니다. 당신이 btrfs를 데이터를 쓸 때, 1GB의 크기는 일반적으로 "현재"덩어리로 데이터를 기록 1 . "현재"청크가 가득 차면 새 청크를 할당합니다. 기존 청크를 비우면 새 청크가 필요할 때 저장 공간을 다시 할당 할 수 있습니다.
파일 시스템이 "dup", "single"또는 "raid1" 스토리지 프로파일 과 함께 둘 이상의 드라이브를 사용하는 경우, 청크 할당자는 항상 사용 가능한 여유 공간이 가장 큰 드라이브에 다음 새 청크를 배치하는 것을 선호합니다. 이렇게하면 일반적으로 드라이브가 동일하게 사용됩니다.
균형은 무엇을 하는가
밸런스 기능은 기존 데이터 청크를 가져 와서 "현재"청크에 다시 써서 작동합니다. 기존 청크를 이런 방식으로 비우면 할당자가 자동으로 사용할 수있게됩니다. 비어있는 기존 청크가 시작하기에 꽉 차 있지 않은 경우 (청크의 오래된 데이터가 삭제되었을 수 있음) 새로운 청크가 관련 데이터로 "보다 꽉 채워져"있기 때문에 디스크 공간이 확보됩니다.
이론적으로 이것은 조각 모음 전략의 일부로 사용될 수있는 부분으로, 많은 사람들이 이미 그렇게 생각한다고 생각합니다. 그러나 균형 기능은 특정 목적을 염두에두고 구축되었으므로 파일 내용을 보지 않는 이유는 무엇입니까 ? 그것은 단지 검사 데이터 여부는 기존의 덩어리 밖으로 복용하는 것은 관련 이 새로운 덩어리로 데이터를 복사하기 전에.
잔액 부분은 어디에 있습니까 ?
파일 시스템에 새 드라이브를 추가 할 때 할당자는 처음에 모든 새 데이터를 새 드라이브에 쓰는 경향이 있습니다. 주로 기존 드라이브보다 사용 가능한 공간이 더 많기 때문입니다. 모든 청크를 다시 쓰면 초기에 균형 잡힌 모든 청크가 새 드라이브에만 기록됩니다. 일단 균등화되면 (균형 균형 조정) 나머지 데이터는 드라이브간에 동일하게 재 할당됩니다.
전형적인 균형 시나리오 :
각각 240GB를 사용하는 2 개의 500GB 드라이브가 있습니다. 다른 500GB 드라이브를 추가합니다. 나는 일반적으로 :
- 드라이브 a : 240GB 사용
- 드라이브 b : 240GB 사용
- 드라이브 c : 0GB 사용
모든 데이터의 균형을 시작합니다. 잔액을 통해 약 1/4 분기에 다음과 유사한 상황이 나타날 수 있습니다.
- 드라이브 a : 180GB 사용
- 드라이브 b : 180GB 사용
- 드라이브 c : 120GB 사용
1/3 정도 쯤되면 균형이 잡힌 것으로 보입니다.
- 드라이브 : 160GB 사용
- 드라이브 b : 160GB 사용
- 드라이브 c : 160GB 사용
물론이 시점에서 밸런스 작업을 중단 할 수는 있지만, 완료하려는 이유는 (좋고 나쁨) 3 입니다.
btrfs에서 조각화가 발생하는 방법
BTRFS는 소입니다 ( 복사 쓰기에 ) 파일 시스템, 데이터가 없다는 것을 의미 결코 이상 작성 (4) . 기존 100MB 파일이 있고 파일의 1MB 부분을 덮어 쓰면 해당 1MB 부분이 드라이브의 기존 데이터 위에 기록되지 않습니다. 대신 "현재"청크의 다른 곳에 작성됩니다. Btrfs는 새 데이터의 "조각"이 저장된 위치를 추적합니다. 이전 데이터가 기본적으로 유지된다는 의미이므로 데이터의 스냅 샷을 유지하는 데 가장 유용합니다. SSD는 매우 유사한 방식으로 데이터를 덮어 쓰지 않기 때문에이 CoW 메커니즘은 SSD의 수명과 성능을 유지하는 데 적합합니다.
조각 모음이 나오는 곳
장점에 관계없이 일부 파일은 매우 자주 덮어 쓰여 지므로 (일반적으로 데이터베이스 파일) 수백 개의 조각이 생깁니다. SSD를 사용하면 단기적으로 성능 저하가 거의 없습니다. 그러나 스핀들 드라이브의 경우 성능이 저하됩니다.
물론 한 가지 해결책은 btrfs의 조각 모음 기능을 사용하는 것입니다. 조각 모음 작업은 현재 청크의 파일 내용을 현재 상태의 논리적 순서로 다시 작성하여 조각을 수많은 개별 조각 대신 하나의 큰 100MB 데이터 집합으로 줄입니다.
다른 해결책은 이와 같은 파일에 "nocow"기능을 사용하는 것입니다. nocow 기능은 파일을 덮어 씁니다. nocow 5 6에 대한 경고 사항이 있습니다 .
다시 요약
노트:
청크의 크기는 일반적으로 1GB이지만 크거나 작을 수 있습니다. RAID 유형을 사용하는 경우 일반적으로 청크는 여러 드라이브에서 1GB 배수로 스트라이프됩니다. 예를 들어, raid0이있는 5 개의 드라이브는 일반적으로 각 드라이브에 1GB 청크로 구성된 5GB 스트라이프가 생성됩니다.
Btrfs는 "참조"를 사용하여 컨텐츠를 파일 화합니다. 파일의 일부를 덮어 쓰면 라이브 파일 시스템은 해당 데이터가 작성된 위치를 "참조"합니다. 그러나 스냅 샷은 여전히 이전 위치를 "참조"할 수 있습니다. 스냅 샷이 없거나 이전 스냅 샷이 삭제되면 원래 덮어 쓴 내용을 나타내는 "ref"가 남지 않습니다. 그런 다음이 내용은 관련이없는 것으로 간주되며 잔액 작업에서 다른 관련 데이터와 함께 복사되지 않습니다.
이 시점에서 스토리지가 간단한 "단일"프로파일 7을 사용한다고 가정 하면 첫 번째 160GB 밸런스가 모두 새 드라이브로 이동하지만이 시점에서 여전히 약 320GB의 밸런스가 남습니다. 나머지는 드라이브에서 균등하게 균형을 이룰 것입니다. 스핀들을 사용하면 이상적으로는 데이터를 더 잘 "확산"하기 위해 btrfs가 3 개의 드라이브를 모두 재조정하기 전에 160 청크의 균형을 유지하는 것이 좋습니다. SSD를 통해 데이터의도 "확산"을 유지하기 위해 시도하는 것은 매우 훨씬 더 가능성이 가능성이 무의미 복잡하고, 도착 매우 SSD의 수명에 좋지.
"nocow"기능은 예외입니다.
스냅 샷이있는 경우 "라이브"파일 조각 모음을 수행하면 스냅 샷과 "라이브"파일이 디스크의 다양한 데이터 위치를 참조하여 데이터가 복제되어 추가 디스크 공간을 차지합니다. 범용 중복 제거 기능을 사용할 수있게되면 문제가되지 않습니다.
nocow를 사용하면 btrfs가 파일 내용에 대한 체크섬을 유지하지 않습니다.
대부분의 공격대 유형 (raid1은 예외)에서, 일반적으로 스트라이프는 모든 드라이브에 걸쳐 기록되므로 드라이브에서 "스프레드"는 무시됩니다 .