A FUSE server for our in-house storage backend

Bài tóm tắt Jane Street 2026 3. Quy mô lớn Độ khó: Khó

Jane Street · 2026 · 3. Quy mô lớn · Độ khó: Khó — bài gốc

Bối cảnh

  • Nhiều workload xử lý dữ liệu cần truy cập thông lượng cao vào lượng lưu trữ lớn. Trước đây dùng sản phẩm mua ngoài (Dell Isilon, VAST); khi dataset lớn dần và nghiên cứu cần truy cập nhanh hơn tới nhiều dữ liệu hơn, họ chạm giới hạn scale của các sản phẩm này.
  • Họ tự viết Depot, một object store kiểu S3 tối ưu cho nghiên cứu, bằng OCaml. Nhưng nhiều thành phần trong hạ tầng nghiên cứu giao dịch đọc file qua giao diện POSIX; một số chuyển được, số khác phải đổi kiến trúc sâu.

Thay đổi chính

  • Viết một FUSE server chỉ đọc để Depot hiện ra như hệ file POSIX (dự án thực tập hè 2026).
  • Tự cài giao thức FUSE bằng OCaml thay vì dùng libfuse (IO chặn xung đột với runtime Async, FFI dễ lỗi). Giao thức ít tài liệu, phải đọc code kernel cho từng loại message. Test serializer bằng dữ liệu bắt từ một FUSE server libfuse thật thay vì liệt kê edge case (theo bài, đây là mẫu quen thuộc ở Jane Street: bắt dữ liệu production làm test đầu cuối).
  • /dev/fuse là character device: mỗi read()/write() phải đúng một message, trong khi thư viện chuẩn của họ mặc định đọc thiếu/ghi thiếu rồi tự lặp. Phải soát thư viện xuống tận C stub.
  • Ánh xạ ngữ nghĩa: tên trong Depot dài tới 7.000 ký tự, FUSE chỉ 1.024, nhiều công cụ UNIX chỉ 256 → ánh xạ tên dài sang tên ngắn và ngược lại. "Bundle" của Depot (giống thư mục) có thể được trỏ từ nhiều đường dẫn, điều POSIX cấm với thư mục → mỗi đường dẫn là một đối tượng riêng, inode tính theo đường dẫn.
  • Hiệu năng: bản đầu chỉ khoảng 30 MiB/s. Đọc đồng thời cùng một file (tài liệu client cấm nhưng code thật chịu được, đã xác nhận với đội Depot) gấp đôi throughput vì readahead của kernel chạy đúng. Bỏ hai lần copy qua string (đọc 4 GiB cấp phát khoảng 8 GiB; 92% lượng cấp phát) bằng cách truyền thẳng buffer → 1,3 GiB/s. Nút tiếp theo có lẽ là kích thước cửa sổ readahead.

Vì sao

  • FUSE cho phép đưa công cụ cũ lên Depot mà không phải viết lại chúng; chỉ đọc vì ca dùng chính là nghiên cứu.

Bài học cho SWE

  • Khi thay kho lưu trữ, một lớp tương thích (POSIX qua FUSE) giúp chuyển dần thay vì ép mọi client đổi.
  • Test giao thức bằng dữ liệu bắt từ một bản cài đặt có sẵn.
  • Đọc code thật chứ không chỉ tài liệu (cả để biết đọc song song an toàn).
  • Copy dữ liệu là chi phí ẩn lớn nhất ở đường dữ liệu thông lượng cao.

Liên quan