Có cân bằng btrfs cũng phân mảnh tập tin?


9

Khi tôi chạy btrfs filesystem balance, điều này có ngầm định các tập tin phân mảnh? Tôi có thể tưởng tượng rằng sự cân bằng chỉ đơn giản là phân bổ lại từng phạm vi tệp một cách riêng biệt, duy trì sự phân mảnh hiện có.

Có một mục FAQ, '"số dư" làm gì?' , không rõ ràng về điểm này:

cân bằng hệ thống tập tin btrfs là một hoạt động chỉ đơn giản là lấy tất cả dữ liệu và siêu dữ liệu trên hệ thống tập tin và ghi lại nó ở một vị trí khác trên các đĩa, chuyển qua thuật toán cấp phát trên đường đi. Ban đầu nó được thiết kế cho các hệ thống tập tin đa thiết bị, để phân tán dữ liệu đồng đều hơn trên các thiết bị (nghĩa là "cân bằng" việc sử dụng chúng). Điều này đặc biệt hữu ích khi thêm các thiết bị mới vào hệ thống tệp gần đầy.

Do cách cân bằng hoạt động, nó cũng có một số tác dụng phụ hữu ích:

  • Nếu có nhiều dữ liệu được phân bổ nhưng không được sử dụng hoặc khối siêu dữ liệu, số dư có thể lấy lại một số không gian được phân bổ đó. Đây là lý do chính để chạy số dư trên hệ thống tập tin một thiết bị.
  • Trên hệ thống tệp có bản sao bị hỏng (ví dụ: RAID-1 FS có đĩa bị chết và bị xóa), nó sẽ buộc FS phải xây dựng lại bản sao dữ liệu bị thiếu trên một trong các thiết bị hiện đang hoạt động, khôi phục khả năng RAID-1 của hệ thống tập tin.

Câu trả lời:


9

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ú:

  1. 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.

  2. 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.

  3. 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.

  4. Ngoại lệ là tính năng "nocow".

  5. 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 đề.

  6. Sử dụng nocow có nghĩa là btrfs không duy trì tổng kiểm tra cho nội dung tệp.

  7. 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 ổ.


Wow, câu trả lời tuyệt vời. Tôi thấy có sự thiếu hụt nghiêm trọng thông tin liên quan đến người dùng BTRFS, trong sách hoặc những thứ tương tự (chứ không giống như ZFS) dường như góp phần vào việc tiếp tục mang tiếng xấu. Bạn đã có một blog hoặc nhiều thứ tốt hơn như thế này?
Andrew Keech

1
Cảm ơn! Tôi thực sự nên mang lại một số nội dung cập nhật hơn ở đó. : - | Thời gian đã vô cùng thiếu: dogma.swiftspirit.co.za
zaTricky

6

Có lẽ nhìn vào mã nguồn của lệnh có thể giúp

Thích hơn btrfs balance start

Thay vào đó, lệnh 'btrfs cân bằng hệ thống tập tin' không được chấp nhận, vui lòng sử dụng lệnh 'btrfs cân bằng bắt đầu'.

Và sau đó trên chuỗi lệnh

"btrfs [filesystem] balance start [options] <path>",
"Balance chunks across the devices",
"Balance and/or convert (change allocation profile of) chunks that",
"passed all filters in a comma-separated list of filters for a",
"particular chunk type.  If filter list is not given balance all",
"chunks of that type.  In case none of the -d, -m or -s options is",
"given balance all chunks in a filesystem."

Tôi có thể cung cấp cho nó một cái nhìn thứ hai nhưng tôi không thể thấy bất kỳ tài liệu tham khảo nào để chống phân mảnh trên các cấu trúc cũng như các cuộc gọi ioctl (). Vì vậy, không có phân mảnh rõ ràng.

Tất cả những gì nó làm là sao chép từ nơi này sang nơi khác và sử dụng bộ cấp phát mặc định trong quy trình. Lấy từ đây

Tùy thuộc vào phân bổ mục đích và chế độ phân bổ, thuật toán có thể trực tiếp tìm kiếm một phạm vi tự do liên tục trong mỗi nhóm phân bổ phù hợp (một nhóm trong btrfs tương ứng với một đoạn được mô tả ở trên

Vì vậy, tùy thuộc vào chế độ phân bổ, không gian trống trên thiết bị, v.v. bạn có thể nói rằng btrfs sẽ phân bổ theo cách mà việc chống phân mảnh sẽ không cần thiết. Mà bạn có thể xem xét một hình thức chống phân mảnh ngầm.

HTH


3

Cân bằng hoạt động ở cấp độ khối; chunk là cách Btrfs thực hiện dự phòng đột kích. Nó không làm bất cứ điều gì ở cấp độ Btree và không phân mảnh.


0

Trong trường hợp bạn sử dụng phương tiện có độ trễ truy cập cao, tỷ lệ ma sát luôn được tính, bất kể hệ thống tập tin được sử dụng. Một tìm kiếm ở lại một tìm kiếm, pediod.


3
Trừ khi bạn đang truy cập dữ liệu từ ổ SSD thì điều đó không có nghĩa gì cả.
Matt

1
Điều đó không trả lời câu hỏi.
Karl Richter

-2

Chống phân mảnh được đánh giá cao. Chắc chắn, trên một chiếc FAT16, nó tạo ra sự khác biệt thực sự, nhưng không phải trên bất cứ thứ gì hiện đại, trong hầu hết các trường hợp. Thực tế, việc cân bằng lại sẽ cải thiện việc tổ chức hệ thống tệp của bạn và các tệp sẽ ít bị phân mảnh hơn.


6
Phân mảnh không thực sự là một vấn đề đối với ext2 / 3/4, xfs, jfs, v.v., nhưng nó có thể là một vấn đề quan trọng đối với btrfs. Xem btrfs.wiki.kernel.org/index.php/Gotchas có nội dung "Các tệp có nhiều ghi ngẫu nhiên có thể bị phân mảnh nhiều (10000+ phạm vi) gây ra sự cố trên ổ cứng và tốc độ tải CPU quá nhiều giây trên các hệ thống có SSD hoặc dung lượng lớn RAM. " Đó không phải là một cường điệu, ngay cả đối với các trường hợp sử dụng phổ biến (các tệp được tải xuống với cơ sở dữ liệu bittorrent, sqlite, v.v.).
nemequ

2
Chống phân mảnh có thể tạo ra sự khác biệt lớn ngay cả với các hệ thống tệp hiện đại hơn, đặc biệt là khi ổ đĩa bắt đầu đầy trên ổ cứng thông thường. Một số hệ thống tệp xử lý nó tốt hơn các hệ thống khác và một số loại tệp kém hơn các hệ thống khác. Không gian chùng, không thể tối ưu hóa các kịch bản, bộ nhớ đọc / ghi, bộ đọc, tối ưu hóa ứng dụng, v.v có xu hướng che giấu rất nhiều điều này. Đối với hầu hết mọi người, mọi người không phải lo lắng về điều đó và chỉ nên lo lắng về việc họ thực sự có vấn đề nghiêm trọng có thể gây ra bởi sự phân mảnh.
jgmjgm
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.