Đi tìm một SQLite nhanh hơn
(avi.im)- SQLite vốn đã là một hệ thống cơ sở dữ liệu nhanh, nhưng các nhà nghiên cứu đang tìm cách làm cho nó còn nhanh hơn
- Các nhà nghiên cứu từ Đại học Helsinki và Cambridge đã công bố bài báo "đồng thiết kế runtime/cơ sở dữ liệu serverless thông qua I/O bất đồng bộ", cho thấy có thể giảm độ trễ đuôi (tail latency) tới 100 lần. Bài báo này trở thành nền tảng cho Limbo, một phiên bản SQLite được viết lại bằng Rust.
io_uring
-
Giải thích về io_uring: Hệ thống con io_uring của nhân Linux cung cấp giao diện cho I/O bất đồng bộ. Nó giảm overhead sao chép bộ đệm thông qua ring buffer giữa không gian người dùng và không gian nhân. Ứng dụng có thể gửi yêu cầu I/O và thực hiện công việc khác cho đến khi nhận được thông báo từ hệ điều hành rằng thao tác I/O đã hoàn tất.
-
Thực thi truy vấn của SQLite: SQLite sử dụng tệp để lưu trữ dữ liệu, mở cơ sở dữ liệu bằng hàm
sqlite3_open(), và chuyển câu lệnh SQL thành bytecode bằng hàmsqlite3_prepare(). Hàmsqlite3_step()thực thi các lệnh bytecode để xử lý truy vấn.
Tiền đề
-
Sự trỗi dậy của điện toán serverless: Trong môi trường serverless, độ trễ cơ sở dữ liệu có thể trở thành vấn đề. Nếu nhúng cơ sở dữ liệu trực tiếp vào runtime ở edge thì sẽ không có độ trễ mạng, và SQLite rất phù hợp với môi trường như vậy.
-
Vấn đề của SQLite: Việc sử dụng I/O đồng bộ khiến tài nguyên không được tối ưu hóa và gây ra các vấn đề về đồng thời cũng như đa thuê bao.
-
Chuyển sang io_uring: Việc thay thế các lời gọi POSIX I/O bằng io_uring không hề đơn giản; cần phải thiết kế lại SQLite để phù hợp với mô hình I/O bất đồng bộ.
Limbo
-
Hỗ trợ I/O bất đồng bộ: Limbo sửa đổi các thành phần VM và BTree để hỗ trợ I/O bất đồng bộ, đồng thời thay thế các lệnh bytecode đồng bộ bằng lệnh bất đồng bộ. I/O bất đồng bộ loại bỏ blocking và cải thiện khả năng đồng thời.
-
Tách biệt truy vấn và storage engine: Đề xuất tách query engine và storage engine để tối đa hóa việc sử dụng tài nguyên.
Đánh giá và kết quả
-
Benchmarking: Nhóm nghiên cứu mô phỏng một runtime serverless đa thuê bao để mỗi tenant có cơ sở dữ liệu nhúng riêng. Khi so sánh độ trễ truy vấn giữa SQLite và Limbo, Limbo giảm độ trễ đuôi ở p999 tới 100 lần.
-
Công việc trong tương lai: Họ dự định thực hiện thêm benchmark với nhiều tiến trình đọc và ghi; lợi thế hiệu năng hiện chỉ nổi bật từ mốc p999 trở đi.
-
Mã nguồn mở: Mã của Limbo được phát hành mã nguồn mở tại: Limbo GitHub
1 bình luận
Ý kiến Hacker News
Có thảo luận rằng một số trường hợp sử dụng cụ thể của điện toán serverless, chẳng hạn như AWS Lambda và cơ sở dữ liệu trung tâm, không phải lúc nào cũng phù hợp với các ứng dụng được xây dựng theo cách serverless
/tmp, và runtime Python đã bao gồm SQLite nên không cần tải lên mã nào ngoài chính hàm đóCó lẽ nên nêu rõ rằng một trong hai nhà nghiên cứu là sếp của tác giả
Đồng ý với nhận định rằng "chỉ từ p999 trở lên mới thấy lợi ích rõ rệt, còn ở p90 và p99 thì hiệu năng gần như giống SQLite"
SQLite có bộ kiểm thử rất rộng nên đã được kiểm tra cực kỳ kỹ lưỡng
Để benchmark, họ mô phỏng một runtime serverless đa tenant, trong đó mỗi tenant có cơ sở dữ liệu nhúng riêng
Trước đây từng có nỗ lực đưa async I/O vào Postgres nhưng đã bị dừng lại
Có câu hỏi về ý tưởng rằng khi async I/O đang chạy thì có thể làm việc khác
Với tư cách là tác giả bài blog, không ngờ bài này lại lên trang nhất
SQLite là mã nguồn mở, nhưng test harness quan trọng thì không
Từng cố tìm một cách đơn giản để tạo ra một định dạng giống JSON như một tập con nghiêm ngặt của định dạng tệp SQLite nhưng không thành công