- Sau khi phương pháp xây dựng trình biên dịch JIT mới (
copy-patch) được đưa vào Python 3.13, tác giả đã quyết định thử áp dụng nó cho PostgreSQL.
- Giới thiệu một cách tiếp cận mới tên là
pg-copyjit, nhằm cải thiện tốc độ của máy chủ PostgreSQL.
- Toàn bộ mã hiện vẫn mang tính thử nghiệm và cần được chuyên gia thẩm định trước khi sử dụng trong môi trường vận hành thực tế.
Ban đầu chưa có JIT, rồi sau đó trình biên dịch LLVM JIT xuất hiện
- PostgreSQL đã được bổ sung biên dịch JIT dùng LLVM, nhưng LLVM có những điểm chưa thật sự phù hợp cho JIT compilation.
- Tối ưu hóa của LLVM có chi phí cao, và nếu không dùng tối ưu hóa thì bản thân việc biên dịch có thể trở nên vô nghĩa.
- Ước tính chi phí truy vấn của PostgreSQL không liên hệ trực tiếp với thời gian thực thi thực tế, nên nhiều người dùng đã tắt trình biên dịch JIT.
Năm 2021, copy-and-patch được mô tả
- Cần tạo ra mã nhanh và đủ tốt trong thời gian ngắn nhất có thể.
- Cách tiếp cận
copy-patch tạo mã rất nhanh bằng cách dùng các stencil (hàm mẫu) được viết bằng C.
- Có thể sao chép stencil sang một vùng nhớ mới, lấp các chỗ trống, rồi nhảy trực tiếp tới hàm đã được “biên dịch”.
Đưa copy-and-patch vào PostgreSQL
- Việc xây dựng một JIT engine mới cho PostgreSQL không quá khó, và có đề xuất biến LLVM thành plugin để có thể đưa vào các trình biên dịch JIT khác.
- Chỉ cần cung cấp một hàm
_PG_jit_provider_init duy nhất và khởi tạo ba callback compile_expr, release_context, reset_after_error là đủ.
- Thuật toán
copy-patch khá đơn giản: tìm stencil cho từng opcode, thêm vào, rồi điền các giá trị cần thiết vào những chỗ trống.
Trạng thái hiện tại
- Hoạt động trên PostgreSQL 16 và hiện chỉ hỗ trợ AMD64.
- Việc sinh mã hoàn tất chỉ trong vài trăm micro giây, nên có thể dùng ngay cả với các truy vấn ngắn.
- Dù chưa đến giai đoạn tối ưu hóa, hiệu năng đã cho thấy cải thiện so với interpreter.
- Số opcode đã triển khai còn ít, nhưng với các truy vấn chưa được hỗ trợ thì PostgreSQL interpreter sẽ thực thi thay.
Việc cần làm...
- Đây là giai đoạn proof of concept, nên việc giúp nó dễ build hoặc đóng gói vẫn chưa phải trọng tâm.
- Hiện đang tập trung vào việc triển khai thêm nhiều opcode hơn và tìm ra các hướng tối ưu hóa.
- Việc port sang các kiến trúc khác cũng đang được cân nhắc nghiêm túc.
Lời cảm ơn
- Tác giả gửi lời cảm ơn tới nơi làm việc hiện tại là Entr’ouvert, nơi các đồng nghiệp đã hỗ trợ để dự án này có được thời gian phát triển.
- Cũng cảm ơn những người bạn DBA và khuyến nghị hãy thử dùng PoWA.
Ý kiến của GN⁺
- Bài viết này giới thiệu một cách tiếp cận mới nhằm cải thiện hiệu năng của máy chủ cơ sở dữ liệu PostgreSQL. Đây có thể là nội dung thú vị với các quản trị viên cơ sở dữ liệu và nhà phát triển.
- Trước khi áp dụng mã thử nghiệm vào môi trường vận hành thực tế, cần kiểm thử và xác minh kỹ lưỡng. Điều này nhằm tránh các rủi ro như mất dữ liệu hoặc downtime.
- So với các trình biên dịch JIT hiện có như LLVM, cách tiếp cận
copy-patch có thể tạo mã nhanh hơn, nên cũng hữu ích cho các truy vấn ngắn.
- Nếu công nghệ này được cộng đồng PostgreSQL đón nhận rộng rãi, nó có thể mở ra một chương mới cho tối ưu hiệu năng cơ sở dữ liệu, cùng với việc mở rộng hỗ trợ sang nhiều kiến trúc khác nhau.
- Ở góc nhìn phản biện, đây vẫn còn là giai đoạn đầu và cần thêm nhiều nghiên cứu, phát triển để biết mức cải thiện hiệu năng thực tế sẽ thể hiện ra sao trong môi trường vận hành thực tế.
Chưa có bình luận nào.