2013-12-11 14 views
6

Tôi đang sử dụng Redis trong một ứng dụng Java, nơi tôi đang đọc các tệp nhật ký, lưu trữ/truy xuất một số thông tin trong Redis cho mỗi nhật ký. Các khóa là địa chỉ IP trong tệp nhật ký của tôi, có nghĩa là chúng luôn là các phím tin tức sắp ra mắt, ngay cả khi cùng xuất hiện thường xuyên.Làm thế nào chậm là Redis khi đầy đủ và đuổi các phím? (Thuật toán LRU)

Tại một số thời điểm, Redis đạt đến kích thước tối đa (3gb trong trường hợp của tôi) và bắt đầu trục xuất một số khóa. Tôi sử dụng cài đặt "allkeys-lru" khi tôi muốn giữ các phím nhỏ nhất.

Toàn bộ ứng dụng sau đó sẽ giảm rất nhiều, lấy 5 lần dài hơn so với lúc bắt đầu. Vì vậy, tôi có ba câu hỏi:

  • bình thường có sự chậm lại đáng kể (5 lần)? Có ai có kinh nghiệm chậm chạp như vậy không? Nếu không, tôi có thể có một vấn đề khác trong mã của tôi (không thể xảy ra khi sự chậm lại xuất hiện chính xác khi Redis đạt đến giới hạn của nó)
  • tôi có thể cải thiện cấu hình của mình không? Tôi đã cố gắng thay đổi cài đặt mẫu tối đa mà không cần nhiều thành công
  • tôi có nên xem xét thay thế cho vấn đề cụ thể của mình không? Có một DB trong bộ nhớ có thể xử lý các phím bị trục xuất với màn trình diễn tốt hơn không? Tôi có thể xem xét một đối tượng Java thuần túy (HashMap ...), ngay cả khi nó không giống như một thiết kế tốt.

chỉnh sửa 1: chúng tôi sử dụng 2 DBS trong Redis

chỉnh sửa 2: Chúng tôi sử dụng 2.2.12 redis (ubuntu 12.04 LTS). Các nghiên cứu sâu hơn giải thích vấn đề: chúng tôi đang sử dụng db0 và db1 trong redis. db1 được sử dụng ít hơn nhiều so với db0, và các khóa hoàn toàn khác nhau. Khi Redis đạt tới bộ nhớ tối đa (và bản đồ LRU bắt đầu loại bỏ khóa), redis sẽ loại bỏ gần như tất cả các khóa db1, làm chậm tất cả các cuộc gọi. Đây là một hành vi kỳ lạ, có lẽ không bình thường và có thể liên quan đến ứng dụng của chúng tôi. Chúng tôi đã khắc phục sự cố này bằng cách chuyển sang cơ chế bộ nhớ khác (tốt hơn) cho các khóa được tải trong db1.

cảm ơn!

Trả lời

8

Tôi không tin Redis là lựa chọn tốt nhất cho trường hợp sử dụng của bạn.

Redis "LRU" chỉ là một thuật toán nỗ lực tốt nhất (tức là khá xa so với LRU chính xác). Redis theo dõi phân bổ bộ nhớ và biết khi nào nó phải giải phóng bộ nhớ. Điều này được kiểm tra trước khi thực thi mỗi lệnh. Cơ chế để loại bỏ khóa trong chế độ "allkeys-lru" bao gồm việc chọn các khóa ngẫu nhiên mẫu maxmemory, so sánh thời gian nhàn rỗi của chúng và chọn khóa nhàn rỗi nhất. Redis lặp lại các thao tác này cho đến khi bộ nhớ được sử dụng thấp hơn maxmemory.

Mẫu tối đa cao hơn, tiêu thụ CPU nhiều hơn, nhưng kết quả chính xác hơn.

Với điều kiện bạn không sử dụng lệnh EXPIRE một cách rõ ràng, không có phí tổn nào khác liên quan đến việc trục xuất chính.

Chạy một thử nghiệm nhanh với Redis benchmark trên kết quả máy tính của tôi trong một thông lượng:

  • 145 Kops/s khi không đuổi xảy ra
  • 125 Kops/s khi 50% bị đuổi xảy ra (tức là 1 chìa khóa trên 2 bị đuổi).

Tôi không thể sao chép hệ số 5 lần bạn đã gặp phải.

Đề xuất rõ ràng để giảm chi phí trục xuất là giảm tối đa mẫu, nhưng điều này cũng có nghĩa là giảm độ chính xác đáng kể.

Đề xuất của tôi sẽ là để thử dùng memcached. Cơ chế LRU là khác nhau. Nó vẫn không chính xác (nó chỉ áp dụng trên một cơ sở sàn), nhưng nó có khả năng sẽ cho kết quả tốt hơn mà Redis về trường hợp sử dụng này.

+0

Cảm ơn Didier. Chúng tôi vẫn đang điều tra vấn đề này, nhưng có vẻ như có điều gì khác gây ra sự chậm lại này. Chúng tôi thực sự sử dụng 2 DB trong redis, và có vẻ như có một hành vi lạ khi đạt đến bộ nhớ tối đa. Tôi sẽ đăng thêm chi tiết khi chúng tôi có nó. Tôi sẽ đợi các câu trả lời có thể khác và xác thực câu trả lời của bạn. – Pixou

+0

@Pixou, Mọi cập nhật về điều này? – Ashish

+3

@Ashish Về cơ bản, chúng tôi phát hiện ra rằng cơ chế LRU hoạt động trên cả hai cơ sở dữ liệu, theo cách mà nếu bạn có một cơ sở dữ liệu lớn và một cơ sở dữ liệu nhỏ, một nhỏ sẽ bị "hút" khá nhanh bởi LRU. Ví dụ, khi mẫu mamemory là 3, LRU dường như lấy 2 mẫu từ DB lớn, 1 từ mẫu nhỏ, ngay cả khi nhỏ hơn 10000 lần. Vì vậy, một lần nữa, chúng tôi đã khắc phục điều đó bằng cách chỉ có một cơ sở dữ liệu trong trường hợp redis của chúng tôi. – Pixou

0

Bạn đang sử dụng phiên bản Redis nào? Phiên bản 2.8 (khá gần đây) đã cải thiện thuật toán hết hạn và nếu bạn đang sử dụng 2.6, bạn có thể thử.

http://download.redis.io/redis-stable/00-RELEASENOTES

+0

Điều này rất đúng, nhưng xin lưu ý rằng việc hết hạn và đuổi học chính là hai điều khác nhau. –

+0

bạn hoàn toàn đúng về điều đó –

Các vấn đề liên quan