Link to original video by Anton Putra
Rust vs Go: Performance Benchmark in Kubernetes #205

Tóm tắt ngắn:
- Video là bản nâng cấp của bài benchmark so sánh hiệu năng giữa Rust và Go trong môi trường Kubernetes.
- Trọng tâm là so sánh hiệu năng của Rust (Actix) và thư viện chuẩn Go trong hai bài test: một API trả về dữ liệu JSON đơn giản và một API phức tạp hơn bao gồm đọc file, upload lên S3 và ghi metadata vào Postgres.
- Kết quả cho thấy Rust có hiệu năng tốt hơn Go trong bài test API đơn giản, đặc biệt ở lượng request lớn, nhưng Go lại nhanh hơn trong bài test API phức tạp liên quan đến S3, một phần do sự khác biệt về độ tối ưu của AWS SDK.
- Các chỉ số được đo đạc bao gồm: sử dụng CPU, bộ nhớ, độ trễ, số request/giây, khả dụng, và hiện tượng bị Kubernetes throttling. Phương pháp benchmark được thực hiện trong cụm Kubernetes sản xuất trên AWS.
Tóm tắt chi tiết:
Video được chia thành các phần chính sau:
1. Giới thiệu và cải tiến:
- Video là phiên bản cải tiến của bài benchmark trước, giải quyết các vấn đề như việc sử dụng Fiber (framework Go) không công bằng và tối ưu hóa code Rust.
- Code Rust được cải thiện nhờ các góp ý và PR từ cộng đồng, bao gồm việc sử dụng Link Time Optimization (LTO), thay đổi
codegen-units
vàpanic
trongCargo.toml
, và thay đổi kiểu dữ liệu UUID để tối ưu hóa quá trình chuyển đổi JSON. Một PR khác đã viết lại toàn bộ code Rust, làm cho code sạch hơn và hiệu quả hơn.
2. So sánh API đơn giản (Test 1):
- So sánh Rust Actix và thư viện chuẩn Go trong việc xử lý API trả về dữ liệu JSON cứng.
- Các chỉ số được theo dõi bao gồm: sử dụng CPU, bộ nhớ, độ trễ, số request/giây, khả dụng và hiện tượng bị throttling.
- Kết quả cho thấy Rust có độ trễ thấp hơn và xử lý được nhiều request hơn Go trước khi bị giảm hiệu năng do đạt 100% CPU (Go bị throttling ở khoảng 14,000 request/giây, Rust ở khoảng 25,000 request/giây). Go tiêu thụ nhiều bộ nhớ hơn ngay từ đầu.
- Người thuyết trình nhấn mạnh tầm quan trọng của việc đo đạc từ phía client để phản ánh trải nghiệm người dùng thực tế và sử dụng ingress controller (như NGINX Ingress) để thu thập chỉ số.
3. So sánh API phức tạp (Test 2):
- So sánh Rust và Go trong việc xử lý API gồm đọc file từ hệ thống file cục bộ, upload lên S3 và ghi metadata vào Postgres.
- Kết quả cho thấy Go nhanh hơn Rust trong việc upload file lên S3, nhưng độ trễ của database tương đương nhau. Điều này được cho là do AWS SDK của Go được tối ưu hơn.
- Cả hai ứng dụng đều xử lý được khoảng 30 request/giây mà không gặp vấn đề, nhưng hiệu năng giảm dần khi số lượng request tăng lên. Cả hai đạt mức tối đa khoảng 50 request/giây. Người thuyết trình cho rằng có thể có bottleneck nào đó cần được tìm hiểu thêm.
4. Kết luận:
- Video trình bày kết quả benchmark chi tiết với các biểu đồ về số request/giây, độ trễ, sử dụng CPU, bộ nhớ, khả dụng, và độ trễ của database và S3.
- Người thuyết trình khuyến khích người xem đóng góp ý kiến và PR để cải thiện code và benchmark. Ông cũng đề xuất các bài test tiếp theo có thể được thực hiện.
Tóm lại, video cung cấp một bài benchmark chi tiết và toàn diện về hiệu năng của Rust và Go trong môi trường Kubernetes, nhấn mạnh vào việc sử dụng các chỉ số thực tế và cách thức tối ưu hóa code để đạt hiệu quả cao. Kết quả cho thấy sự khác biệt về hiệu năng giữa hai ngôn ngữ phụ thuộc vào loại tác vụ, và Go có lợi thế trong các tác vụ liên quan đến AWS SDK.