TL; DR
Tính năng chống phân mảnh của Btrfs dành riêng cho việc sửa lỗi phân mảnh trong siêu dữ liệu thư mục và nội dung tệp, trong khi tính năng cân bằng được tạo để " cân bằng " (do đó là tên) lượng dữ liệu được chia sẻ giữa các ổ đĩa mỗi khi ổ đĩa được thêm hoặc xóa. Mặc dù chúng có một số trùng lặp về mặt lý thuyết trong những gì chúng làm, nhưng chúng không liên quan trực tiếp, do đó tài liệu không liên kết hai tính năng.
Verbose trả lời dưới đây. Tất nhiên lưu ý rằng câu trả lời dài của tôi là với hy vọng rằng nó sẽ giúp những người khác không có bối cảnh đầy đủ của các vấn đề phải đối mặt.
Phân bổ chunk
Một khái niệm quan trọng với btrfs là phân bổ chunk. Khi bạn ghi dữ liệu vào btrfs, nó ghi dữ liệu đó vào một đoạn "hiện tại", thường là 1GB ở kích thước 1 . Nếu đoạn "hiện tại" đầy, nó sẽ phân bổ một đoạn mới. Nếu một đoạn hiện có được làm trống, không gian lưu trữ của nó được tạo sẵn để phân bổ lại khi cần một đoạn mới.
Nếu hệ thống tập tin đang sử dụng nhiều hơn một ổ đĩa với cấu hình lưu trữ "dup", "single" hoặc "raid1" , bộ cấp phát chunk luôn ưu tiên đặt đoạn mới tiếp theo trên (các) ổ đĩa với không gian trống nhất có sẵn. Điều này đảm bảo, nói chung, các ổ đĩa được sử dụng như nhau.
Làm thế nào cân bằng
Tính năng cân bằng hoạt động bằng cách lấy các khối dữ liệu hiện có và viết lại chúng vào khối "hiện tại". Khi một đoạn hiện có được làm trống theo cách này, nó sẽ tự động được cung cấp cho người cấp phát. Nếu đoạn dữ liệu hiện tại bị xóa không đầy đủ để bắt đầu (có lẽ dữ liệu cũ trong đoạn dữ liệu đã bị xóa), kết quả cuối cùng là giải phóng không gian đĩa vì đoạn dữ liệu mới hơn được "đóng gói chặt chẽ hơn" với dữ liệu liên quan.
Về lý thuyết, đây là phần có thể được sử dụng như một phần của chiến lược phân mảnh , mà tôi cảm thấy là lý do mà nhiều người cho rằng nó đã làm. Tuy nhiên, tất nhiên, tính năng cân bằng được xây dựng với mục đích cụ thể, do đó tại sao nó không nhìn vào nội dung tệp. Nó chỉ kiểm tra xem dữ liệu mà nó lấy ra khỏi các đoạn hiện có có liên quan 2 hay không trước khi sao chép dữ liệu đó sang đoạn mới.
Trường hợp không cân đối một phần vào được không?
Khi bạn thêm một ổ đĩa mới vào hệ thống tập tin, trước tiên, bộ cấp phát sẽ có xu hướng ghi tất cả dữ liệu mới vào ổ đĩa mới, chủ yếu vì nó có nhiều không gian trống hơn các ổ đĩa hiện có. Bằng cách viết lại tất cả các khối, tất cả các khối cân bằng ban đầu chỉ được ghi vào ổ đĩa mới. Khi nó đã được cân bằng (trở nên cân bằng), phần còn lại của dữ liệu sẽ được phân bổ lại như nhau giữa các ổ đĩa.
Kịch bản cân bằng điển hình:
Tôi có 2 ổ 500 GB với 240 GB được sử dụng trên mỗi ổ; Tôi thêm một ổ đĩa 500 GB. Tôi thường có:
- ổ a: 240GB đã sử dụng
- ổ b: 240GB đã sử dụng
- ổ đĩa c: 0GB đã sử dụng
Tôi bắt đầu một sự cân bằng của tất cả các dữ liệu. Khoảng một phần tư thông qua số dư, tôi có thể thấy một tình huống tương tự như sau:
- ổ a: 180GB đã sử dụng
- ổ b: 180GB đã sử dụng
- ổ đĩa c: 120GB đã sử dụng
Ở khoảng một phần ba, nó dường như được cân bằng:
- ổ đĩa: 160GB đã sử dụng
- ổ b: 160GB đã sử dụng
- ổ đĩa c: 160GB đã sử dụng
Tất nhiên bạn có thể dừng hoạt động cân bằng tại thời điểm này, mặc dù có những lý do (tốt và xấu) tại sao bạn có thể muốn để nó kết thúc 3 .
Làm thế nào sự phân mảnh xảy ra trong btrfs
Btrfs là một hệ thống tập tin CoW ( Copy on Write ), có nghĩa là dữ liệu không bao giờ được ghi đè 4 . Nếu bạn có tệp 100MB hiện có và ghi đè lên phần 1 MB của tệp, phần 1 MB đó sẽ không được ghi trên dữ liệu hiện có trên ổ đĩa. Thay vào đó, nó được viết ở nơi khác trong đoạn "hiện tại". Btrfs theo dõi nơi các "đoạn" dữ liệu mới được lưu trữ. Điều này hữu ích nhất để duy trì ảnh chụp nhanh của dữ liệu vì nó có nghĩa là dữ liệu cũ được bảo tồn theo mặc định. Bởi vì SSD, theo một cách rất giống nhau, cũng không bao giờ ghi đè dữ liệu, cơ chế CoW này cho vay rất tốt để cho phép SSD duy trì tuổi thọ và hiệu suất của chúng.
Trường hợp phân mảnh đi vào
Bất kể ưu điểm là gì, một số tệp được ghi đè quá thường xuyên (thường là tệp cơ sở dữ liệu), do đó cuối cùng có hàng trăm phân đoạn này. Với SSD, có rất ít hiệu suất trong thời gian ngắn. Nhưng với các ổ trục chính, hình phạt hiệu suất là nghiêm trọng.
Tất nhiên, một giải pháp là sử dụng tính năng chống phân mảnh của btrfs. Hoạt động chống phân mảnh ghi lại nội dung tệp trong đoạn hiện tại theo thứ tự logic của trạng thái hiện tại của nó, do đó giảm các đoạn thành một tập dữ liệu lớn 100 MB thay vì nhiều phần riêng biệt.
Một giải pháp thay thế sẽ là sử dụng tính năng "nocow" dành riêng cho các tệp như thế này. Tính năng nocow khiến tập tin bị ghi đè tại chỗ. Coi chừng có những cảnh báo đến nocow 5 6 .
Tóm tắt lại
Sự cân bằng nhìn vào các khối và sọc - và thực sự không nhận thức được nội dung tệp ngoại trừ việc dữ liệu trong các khối đó có còn phù hợp hay không.
Hoạt động chống phân mảnh xem xét dữ liệu thư mục và nội dung tệp riêng lẻ và ghi lại dữ liệu theo cách liền kề nhất có thể. Mặt trái là với các ảnh chụp nhanh, trong đó phân mảnh gây ra sự trùng lặp và sử dụng ổ đĩa thêm.
Ghi chú:
Mặc dù các khối thường có kích thước 1GB, chúng có thể lớn hơn hoặc nhỏ hơn. Khi sử dụng các loại đột kích, các khối thường được sọc trên nhiều ổ đĩa trong bội số 1GB. Ví dụ: 5 ổ đĩa với raid0 thường dẫn đến một dải 5 GB bao gồm các khối 1 GB được ghi vào mỗi ổ đĩa.
Btrfs sử dụng "tài liệu tham khảo" cho nội dung tập tin. Khi một phần của tệp bị ghi đè, hệ thống tệp trực tiếp "tham chiếu" vị trí nơi dữ liệu đó được ghi. Ảnh chụp nhanh tuy nhiên vẫn có thể "tham chiếu" vị trí cũ. Nếu không có ảnh chụp nhanh - hoặc ảnh chụp nhanh cũ bị xóa, kết quả này sẽ không còn các khoảng "ref" tham chiếu đến nội dung được ghi đè ban đầu. Nội dung này sau đó được coi là không liên quan và sẽ không được sao chép với các dữ liệu liên quan khác trong hoạt động cân bằng.
Tại thời điểm này, giả sử lưu trữ bằng cách sử dụng đơn giản "single" Hồ sơ 7 , các 160GB đầu tiên cân sẽ tất cả được chuyển sang ổ đĩa mới - nhưng cũng vào thời điểm này, nó vẫn có khoảng 320GB còn lại để cân bằng. Phần còn lại sẽ được cân bằng như nhau trên các ổ đĩa. Với các trục chính, lý tưởng nhất là bạn chỉ muốn cân bằng 160 khối trước khi có btrfs cân bằng lại cả 3 ổ đĩa để "lây lan" dữ liệu tốt hơn. Với SSD, việc cố gắng duy trì "sự lây lan" dữ liệu thậm chí trở nên rất phức tạp, rất có thể là vô nghĩa và rất có thể rất tệ cho tuổi thọ của SSD.
Ngoại lệ là tính năng "nocow".
Nếu có ảnh chụp nhanh, việc chống phân mảnh tệp "trực tiếp" sẽ khiến tệp chụp nhanh và tệp "trực tiếp" tham chiếu đến các vị trí dữ liệu khác nhau trên đĩa, khiến dữ liệu bị trùng lặp và do đó chiếm thêm không gian đĩa. Khi tính năng khử trùng mục đích chung trở nên khả dụng, điều này sẽ không gây ra nhiều vấn đề.
Sử dụng nocow có nghĩa là btrfs không duy trì tổng kiểm tra cho nội dung tệp.
Với hầu hết các loại đột kích (raid1 là ngoại lệ), "lây lan" trên các ổ đĩa sẽ không còn nữa vì các sọc thường được ghi trên tất cả các ổ.