1 điểm bởi GN⁺ 2024-10-31 | 1 bình luận | Chia sẻ qua WhatsApp

Khử trùng lặp trong OpenZFS là gì?

  • Định nghĩa khử trùng lặp: Trong OpenZFS, trước khi ghi dữ liệu xuống đĩa, hệ thống sẽ kiểm tra xem dữ liệu đó đã tồn tại trên đĩa hay chưa; nếu đã tồn tại thì không ghi mới mà chỉ thêm tham chiếu tới bản sao hiện có.
  • Thách thức của khử trùng lặp: Việc kiểm tra dữ liệu đã có trên đĩa hay chưa và biết nó nằm ở đâu là điều khó khăn. Điều này đòi hỏi thêm các thao tác vào/ra (IO), từ đó có thể làm giảm hiệu năng.

Khử trùng lặp hoạt động như thế nào?

  • Cách hoạt động: Khi khử trùng lặp được bật, một khối dữ liệu sẽ được chuẩn bị và checksum được tính toán. Trước đây, bộ cấp phát metaslab sẽ cấp phát không gian, nhưng khi khử trùng lặp được bật thì checksum sẽ được tra cứu trong bảng khử trùng lặp.
  • Bảng khử trùng lặp: Bảng này được lưu dưới dạng một bảng băm, dùng checksum làm khóa và vị trí trên đĩa cùng số lượng tham chiếu làm giá trị. Nó được xem là một phần của metadata của pool.

Vấn đề của khử trùng lặp truyền thống

  • Vấn đề của bảng khử trùng lặp: Khử trùng lặp truyền thống được triển khai bằng đối tượng bảng băm trên đĩa của OpenZFS. Đây là một cấu trúc phức tạp và không phù hợp với các ứng dụng như khử trùng lặp.
  • Mức sử dụng bộ nhớ: Việc đọc bảng khử trùng lặp được cache trong ARC, và nếu có đủ RAM thì có thể giảm phần đọc trong quá trình cập nhật bảng.
  • Vấn đề mục duy nhất: Không gian cần để theo dõi các mục duy nhất trong bảng khử trùng lặp là một vấn đề. Các khối có số lượng tham chiếu bằng 1 vẫn chiếm chỗ trong bảng, và nếu cùng dữ liệu đó không được ghi lại thì chi phí này sẽ không thể thu hồi.

FastDedup giải quyết vấn đề như thế nào?

  • Thu gọn danh sách mục đang hoạt động: Để giảm mức sử dụng bộ nhớ, dấu chân bộ nhớ của danh sách mục đang hoạt động được cắt giảm. Trong bảng khử trùng lặp mới, phần "giá trị" của mỗi mục được giảm xuống còn 72 byte.
  • Nhật ký khử trùng lặp: Thay vì danh sách mục đang hoạt động, hệ thống dùng log để ghi lại các thay đổi và phát lại log khi khôi phục sau sự cố. Log được lưu trong bộ nhớ để cho phép tra cứu nhanh.
  • Flush log gia tăng: Để kiểm soát kích thước log, một phần log sẽ được ghi vào ZAP ở mỗi giao dịch. Khi có áp lực bộ nhớ, việc flush log sẽ được tăng tốc.

Tổng kết của GN⁺

  • Tính năng "FastDedup" mới của OpenZFS được phát triển nhằm giải quyết các vấn đề của khử trùng lặp truyền thống. Nó giúp giảm mức sử dụng bộ nhớ và cho phép quản lý dữ liệu hiệu quả thông qua log.
  • Khử trùng lặp chỉ hữu ích với một số workload nhất định, và với mục đích sử dụng thông thường thì nó vẫn có thể kém hiệu quả. Nguyên nhân là do overhead quản lý bảng khử trùng lặp vẫn rất lớn.
  • Một dự án khác có tính năng tương tự là khả năng khử trùng lặp của Btrfs, và đây có thể là một lựa chọn thay thế trên các hệ thống tệp khác.

1 bình luận

 
GN⁺ 2024-10-31
Ý kiến Hacker News
  • Tôi bị tiêu đề thu hút nên nhấp vào, nhưng dù không hề quan tâm đến ZFS, tôi vẫn đọc gần như toàn bộ bài viết. Bài viết giải thích rất rõ ràng, và tôi đặc biệt thích giao diện CSS trên di động. Phần tóm tắt ngắn gọn nằm ở cuối bài.

  • Ngoài thảo luận về copy_file_range, sẽ rất hay nếu hệ thống tệp có thể tìm các tệp từ 1MB trở lên có cùng hash và áp dụng khử trùng lặp một cách chọn lọc.

  • Vấn đề của khử trùng lặp truyền thống là overhead quá lớn, nên ngoài một số workload cụ thể thì rất khó thấy hiệu quả. Tôi đã thấy mức tiết kiệm 3:1 từ khử trùng lặp/nén với workload VMWare trên các array của Pure và Dell/EMC.

  • Hiệu quả của khử trùng lặp bị ảnh hưởng rất nhiều bởi kích thước khối được hash. Khối càng nhỏ thì xác suất có khối trùng khớp càng cao. Cá nhân tôi thích kích thước khối 4KB.

  • Tôi muốn có khử trùng lặp "offline" hoặc khử trùng lặp "lười". Khi khử trùng lặp được bật, mọi thao tác ghi và giải phóng đều đòi hỏi tra cứu và ghi vào bảng khử trùng lặp. Tôi muốn việc ghi dữ liệu hoàn tất nhanh.

  • Tôi rất kỳ vọng vào khử trùng lặp nhanh. Tôi từng muốn dùng khử trùng lặp ZFS cho dữ liệu ArchiveBox. Có vẻ như việc lưu trữ nhiều URL và để hệ thống tệp nén mọi thứ sẽ trở nên khả thi.

  • Tôi đã dùng khử trùng lặp ZFS cho kho lưu trữ cá nhân và hiện đang giảm dung lượng đĩa xuống còn 1/3. ZFS hoạt động rất tốt về độ tin cậy và đã giúp tránh mất dữ liệu.

  • Khử trùng lặp nói chung nghe thì hay về mặt lý thuyết nhưng thực tế lại không hoạt động tốt. IPFS cố gắng khử trùng lặp dữ liệu bằng cách dùng các mảnh có kích thước biến đổi, nhưng trên thực tế không tạo ra khác biệt mà chỉ làm tăng độ phức tạp.

  • Sẽ rất tốt nếu phần cứng chuyên dụng của bộ điều khiển đĩa được cải tiến để có thể cho hệ thống thấy hash của các khối nhằm phục vụ những phép tính như ECC.

  • Tôi ước API của hệ thống tệp có một hình thức hoàn toàn khác. API hệ thống tệp của mọi OS đều bị đóng khung vì tính tương thích.

  • Nếu hiệu năng ghi là quan trọng thì không cần khử trùng lặp khi ghi. Có thể thực hiện khử trùng lặp sau đó, đồng thời, và với mức ưu tiên thấp.