Redis xử lý đa luồng

Redis thường được biết đến như một mô hình đơn quy trình, đơn luồng. Đây không phải là sự thật. Redis cũng chạy nhiều luồng phụ trợ để thực hiện các công việc dọn dẹp phụ trợ, chẳng hạn như làm sạch dữ liệu bẩn và đóng các bộ mô tả tệp. Trong Redis, luồng chính chịu trách nhiệm cho các tác vụ chính, bao gồm nhưng không giới hạn ở: nhận kết nối từ máy khách, xử lý các sự kiện đọc / ghi kết nối, phân tích cú pháp yêu cầu, xử lý lệnh, xử lý sự kiện hẹn giờ và đồng bộ hóa dữ liệu. Chỉ một lõi CPU chạy một quy trình và một luồng duy nhất.

Đối với các gói nhỏ, máy chủ Redis có thể xử lý 80.000 đến 100.000 QPS. QPS lớn hơn vượt quá khả năng xử lý của máy chủ Redis. Một giải pháp phổ biến là phân vùng dữ liệu và sử dụng nhiều máy chủ trong kiến ​​trúc phân tán.

Tuy nhiên, giải pháp này cũng có nhiều điểm hạn chế. Ví dụ: quá nhiều máy chủ Redis để quản lý; một số lệnh áp dụng cho một máy chủ Redis không hoạt động trên các phân vùng dữ liệu; phân vùng dữ liệu không thể giải quyết vấn đề đọc / ghi điểm nóng; và độ lệch dữ liệu, phân phối lại và tăng / giảm quy mô trở nên phức tạp hơn. Do các hạn chế của quy trình đơn và luồng đơn, chúng tôi hy vọng rằng đa luồng có thể được tái tạo để sử dụng đầy đủ các ưu điểm của kiến ​​trúc đa lõi SMP, do đó tăng thông lượng của một máy chủ Redis duy nhất.

Để làm cho Redis đa luồng, cách đơn giản nhất để nghĩ đến là mọi luồng thực hiện cả I / O và xử lý lệnh. Tuy nhiên, vì cấu trúc dữ liệu được Redis xử lý rất phức tạp, nên đa luồng cần sử dụng các khóa để đảm bảo an toàn cho luồng. Xử lý không đúng mức độ chi tiết của khóa có thể làm giảm hiệu suất.

Chúng tôi đề xuất rằng số lượng luồng I / O nên được tăng lên để cho phép một luồng I / O độc lập đọc / ghi dữ liệu trong các kết nối, phân tích cú pháp lệnh và trả lời gói dữ liệu, đồng thời vẫn để một luồng duy nhất xử lý các lệnh và thực thi sự kiện hẹn giờ. Bằng cách này, thông lượng của một máy chủ Redis duy nhất có thể được tăng lên.

Quy trình đơn và mô hình luồng đơn

Ưu điểm

  1. Do các hạn chế của mô hình một quy trình và một luồng, các hoạt động tốn thời gian (chẳng hạn như dict rehash và xóa khóa đã hết hạn) được chia thành nhiều bước và thực hiện từng bước một trong quá trình triển khai Redis. Điều này ngăn cản việc thực hiện một hoạt động trong một thời gian dài và do đó tránh việc hệ thống bị chặn trong thời gian dài bởi một hoạt động. Mã một quy trình và một luồng rất dễ biên dịch, điều này làm giảm việc chuyển đổi ngữ cảnh và khóa bắt giữ do đa quy trình và đa luồng gây ra.

Nhược điểm

  1. Chỉ có thể sử dụng một lõi CPU và không thể tận dụng được các ưu điểm của đa lõi.
  2. Đối với các ứng dụng I / O nặng, một lượng lớn dung lượng CPU sẽ bị tiêu tốn bởi các hoạt động I / O của mạng. Các ứng dụng sử dụng Redis làm bộ nhớ đệm thường là các ứng dụng I / O nặng. Các ứng dụng này về cơ bản có QPS cao, sử dụng các lệnh tương đối đơn giản (chẳng hạn như get, set và incr), nhưng lại nhạy cảm với RT. Chúng thường có mức sử dụng băng thông cao, thậm chí có thể lên tới hàng trăm megabit. Nhờ sự phổ biến của bộ điều hợp mạng 10 GB và 25 GB, băng thông mạng không còn là điểm nghẽn. Do đó, điều chúng ta cần suy nghĩ là làm thế nào để tận dụng những ưu điểm của đa lõi và hiệu suất của bộ điều hợp mạng.

Mô hình đa luồng và triển khai

Mô hình chủ đề

Có ba loại chủ đề, cụ thể là:

  1. Chủ đề chính
  2. Chuỗi I / O
  3. Chủ đề công nhân

Redis xử lý đa luồng

  1. Luồng chính: Nhận kết nối, tạo máy khách và chuyển tiếp kết nối tới luồng I / O.
  2. Luồng I / O: Xử lý các sự kiện đọc / ghi kết nối, phân tích cú pháp lệnh, chuyển tiếp các lệnh đã phân tích cú pháp hoàn chỉnh đến luồng công nhân để xử lý, gửi các gói phản hồi và xóa các kết nối.
  3. Luồng công việc: Xử lý các lệnh, tạo các gói phản hồi của máy khách và thực hiện các sự kiện hẹn giờ.
  4. Luồng chính, luồng I / O và luồng công nhân được điều khiển bởi các sự kiện riêng biệt.
  5. Các luồng trao đổi dữ liệu thông qua hàng đợi không có khóa và gửi thông báo qua các đường hầm.

Lợi ích của mô hình đa luồng

Tăng hiệu suất đọc / ghi

Kết quả kiểm tra căng thẳng chỉ ra rằng hiệu suất đọc / ghi có thể được cải thiện khoảng ba lần trong kịch bản gói nhỏ.

Redis xử lý đa luồng

Tăng tốc độ đồng bộ hóa Master / Slave

Khi cái chủ gửi dữ liệu đồng bộ hóa đến bộ phận phụ, dữ liệu sẽ được gửi trong luồng I / O. Khi đọc dữ liệu từ master, slave sẽ đọc toàn bộ dữ liệu từ luồng worker và dữ liệu gia tăng từ luồng I / O. Điều này có thể làm tăng tốc độ đồng bộ hóa một cách hiệu quả.

Nhiệm vụ tiếp theo

Nhiệm vụ đầu tiên là tăng số luồng I / O và tối ưu hóa khả năng đọc / ghi I / O. Tiếp theo, chúng ta có thể chia nhỏ luồng worker để mỗi luồng hoàn thành việc đọc I / O, cũng như công việc của luồng worker.

Đặt số luồng I / O

  1. Kết quả kiểm tra chỉ ra rằng số luồng I / O không được vượt quá 6. Nếu không, luồng worker sẽ trở thành nút thắt cổ chai cho các hoạt động đơn giản.
  2. Khi khởi động một quy trình, số luồng I / O phải được đặt. Khi quá trình đang chạy, số luồng I / O không thể được sửa đổi. Dựa trên chính sách phân bổ kết nối hiện tại, việc sửa đổi số lượng luồng I / O liên quan đến việc phân bổ lại các kết nối, điều này khá phức tạp.

Cân nhắc

  1. Với sự phổ biến của các bộ điều hợp mạng 10 GB và 25 GB, làm thế nào để sử dụng đầy đủ hiệu suất phần cứng phải được xem xét cẩn thận. Chúng ta có thể sử dụng các công nghệ, chẳng hạn như nhiều luồng cho mạngI / O và hạt nhân bỏ qua ngăn xếp giao thức chế độ người dùng.
  2. Luồng I / O có thể được sử dụng để thực hiện việc di chuyển dữ liệu không bị chặn. Luồng I / O mã hóa quá trình dữ liệu hoặc chuyển tiếp các lệnh, trong khi nút đích giải mã dữ liệu hoặc thực hiện các lệnh.

  • alibaba cloud
  • database
  • redis
  • tutorial
  • performance

10 hữu ích 0 bình luận 22k xem chia sẻ