- Redis Inc đã làm lung lay niềm tin của cộng đồng với quyết định đóng mã nguồn (chuyển sang SSPL), nhưng cộng đồng nhà phát triển đã tập hợp quanh nhánh fork Valkey, tiếp tục đóng góp và đổi mới rất sôi động
- Redis 8.0 đã quay lại với mô hình mã nguồn mở, và nhà sáng lập Antirez cũng trở lại để tham gia các tính năng mới và tối ưu hóa, cho thấy cả hai bên đều đang phát triển rất nhanh
- Theo kết quả benchmark mới nhất, Valkey 8.1.1 trong môi trường 8vCPU có hiệu năng SET cao hơn 37% so với Redis 8.0, đồng thời độ trễ p99 cũng ngắn hơn (hiệu năng GET cũng tốt hơn 16%)
- Với các kỹ thuật tinh chỉnh thực chiến như IO thread/core pinning, Valkey đạt mức tăng thông lượng hơn 3 lần trong môi trường đa luồng và giảm độ trễ xuống mức tối thiểu
- Bài viết cũng chia sẻ benchmark gần với môi trường sử dụng thực tế cùng các mẹo tuning, đồng thời hướng dẫn cách diễn giải kết quả benchmark và áp dụng trong vận hành thực tế
Redis đóng mã nguồn và sự xuất hiện của Valkey
- Một năm trước, Redis Inc (trước đây là Garantia Data) đã làm xấu đi mối quan hệ tin cậy với cộng đồng khi thay đổi giấy phép mã nguồn mở (áp dụng SSPL)
- Open fork Valkey ra đời như một giải pháp cho vấn đề này, và đã trở thành một tài sản công nghệ được dùng rộng rãi trong hệ thống phân tán, cache và xử lý dữ liệu thời gian thực
- Phía Redis sau đó cũng nỗ lực khôi phục niềm tin bằng việc Antirez (nhà sáng lập) trở lại, tăng cường hiệu năng/tính năng và đưa Redis 8.0 quay lại mã nguồn mở
Valkey 8.1 vs Redis 8.0: So sánh hiệu năng
- Benchmark SET trên cùng điều kiện: instance AWS c8g.2xl 8vCPU, item 1KB / keyspace 3M / 500 kết nối
- Valkey 8.1.1: 999.8K RPS (p99 0.8ms)
- Redis 8.0: 729.4K RPS (p99 0.99ms)
- Valkey cao hơn 37% ở SET, 16% ở GET, và nhanh hơn 30% ở SET p99, 60% ở GET p99
- Khi áp dụng 6 IO thread, Valkey tăng từ 239K → 678K RPS (2.8 lần), p99 giảm từ 1.68ms → 0.93ms (44%)
- Redis cũng tăng từ 235K → 563K RPS với IO thread, p99 giảm từ 1.35ms → 0.84ms (40%)
Tác động của đa luồng và tuning lõi CPU
- IO thread bắt đầu cho hiệu quả rõ rệt từ 3 luồng trở lên, và Valkey tạo khoảng cách lớn hơn Redis từ sau mốc 4 luồng
- Khi giới hạn lõi IRQ (interrupt) còn 2 lõi và cố định Redis/Valkey vào 6 lõi còn lại (pinning), hiệu năng tiếp tục tăng thêm
- Valkey: 832K → 999.8K RPS (pinning lõi/IRQ, sử dụng 80% CPU)
- Việc tách lõi IRQ và lõi ứng dụng giúp cải thiện hiệu quả cache và giảm tail latency xuống mức tối thiểu
- Có cung cấp ví dụ thực tế dùng Docker với
cpuset-cpus,--io-threadsv.v.
Tái hiện benchmark và mẹo thực chiến
- Sử dụng instance AWS Graviton4 (c8g.2xlarge) mới nhất cùng cluster placement group
- Đạt hiệu năng tối đa bằng core pinning / tách IRQ / điều chỉnh số kết nối (khoảng 400~500)
- Kích thước keyspace / item cũng cần tuning; giá trị nhỏ và keyspace nhỏ giúp tăng tỷ lệ hit của L3 cache
- Khuyến nghị tích cực sử dụng các công cụ benchmark đa luồng như valkey-benchmark hoặc rpc-perf (công cụ nền Rust gần với môi trường thực tế hơn)
docker run --network="host" --rm --cpuset-cpus="2-7" \ valkey/valkey:8.0.1 valkey-benchmark \ -h 172.31.4.92 -p 6379 -t SET,GET -n 100000000 -c 256 \ -r 3000000 --threads 6 -d 1024
Giới hạn và lưu ý khi đo hiệu năng
-
Kết quả benchmark có thể khác với môi trường vận hành thực tế
- Workload thực tế có nhiều yếu tố kết hợp như tỷ lệ trộn SET:GET, biến động tải, mục tiêu TPS, độ trễ mạng v.v.
- Khi số kết nối tăng đột biến, cũng quan sát thấy độ trễ hàng đợi tăng, throughput giảm và tail latency tăng
- Kết quả có thể thay đổi rất lớn tùy theo công cụ/tùy chọn benchmark, topology mạng v.v.
Các cột mốc tăng trưởng chính và sự phát triển của cộng đồng
Dự án Valkey đã phát triển rất tích cực trong năm qua ở nhiều khía cạnh khác nhau
- Trên GitHub và các nền tảng khác, nhiều nhà phát triển và doanh nghiệp đã hợp tác để bổ sung tính năng, sửa lỗi và cải thiện bảo mật
- Cũng đầu tư vào tài liệu hóa và hỗ trợ người dùng, qua đó giảm rào cản cho người dùng mới
- Trong quá trình vận hành dự án, ra quyết định minh bạch và bỏ phiếu cộng đồng được nhấn mạnh
Giá trị công nghệ và trong ngành
Valkey có những điểm mạnh sau
- Không bị ràng buộc bởi giấy phép, nên là lựa chọn hấp dẫn cho nhà cung cấp dịch vụ đám mây và các công ty web quy mô lớn
- Có mức độ tương thích cao với Redis nên việc migration cũng dễ dàng
- Là dự án phát triển theo định hướng cộng đồng, nên có thể phản ánh nhiều nhu cầu khác nhau và cập nhật nhanh, liên tục
Kết luận và hàm ý
- Valkey chỉ sau 1 năm kể từ khi fork Redis đã cho thấy thành quả vượt Redis về công nghệ, hiệu năng và cộng đồng
- Các kỹ thuật tuning thực chiến như IO thread, tách lõi CPU/IRQ và điều chỉnh kết nối, cùng công cụ phù hợp, là yếu tố then chốt
- Hiệu năng không tự động xuất hiện; việc tối ưu liên tục theo hệ thống/workload/hạ tầng là điều bắt buộc
- Trong môi trường dịch vụ thực tế, cần tiếp cận theo hướng thực dụng: không chỉ dựa vào con số benchmark mà phải tự kiểm thử trong nhiều tình huống khác nhau
4 bình luận
Redis đúng là đã đưa ra nhiều quyết định sai lầm, nhưng nhìn cảnh gấu biểu diễn còn người huấn luyện nhận tiền thì cũng thật đáng tiếc.
Đây là tài liệu tóm tắt những cải tiến đã được thực hiện trong Valkey 8, được đăng trong nhóm Facebook "Redis User Group".
https://www.facebook.com/groups/rediskorea/posts/3927030954110001/
Xem cùng với nội dung trên thì có lẽ sẽ giúp bạn dễ hiểu hơn.
Thật ra không hẳn là Valkey đã làm gì đó... mà là bên kia tự lụn bại thôi...
Ý kiến Hacker News
write(2)/read(2)có thể rất chậm, nên chỉ phần I/O được xử lý song song bằng N thread trong trạng thái zero contention, rồi ngay sau đó quay lại mô hình single-thread. Tôi ghi nhận và cảm ơn đội ngũ Valkey đã tiếp tục phát triển hệ thống này. Hệ thống đó vốn đã hoạt động từ lâu, và thành thật mà nói tôi thấy không thoải mái khi báo chí chỉ phóng đại những dữ liệu thực tế không thay đổi. Những tính năng kiểu này trên thực tế hấp dẫn hơn với người dùng doanh nghiệp hoặc các nhà cung cấp đám mây như Amazon, Google hơn là đa số người dùng Redis thông thường. Trừ khi buộc phải xử lý tải cực lớn hay rất nhiều người dùng cùng lúc, còn không thì trong hầu hết trường hợp Redis dùng CPU thấp nên chẳng cần bật những thứ này. Gần đây khi phát triển vector set data type trong Redis, chúng tôi đang lấy threading làm mặc định, và việc ghi vector set qua VADD cũng có thể thực hiện theo kiểu threaded. Các cấu trúc dữ liệu như HNSW mang đến thời gian hằng số rất lớn lần đầu tiên trong lịch sử Redis, nên bản thân không gian thiết kế đã khác đi. Trước đây tôi cũng đã từng triển khai hỗ trợ thread cho module. Việc có dùng thread hay không là một quyết định tùy bối cảnh.