Nâng Cấp Hiệu Năng Mô-Đun Cluster Của Skynet - nói dối e blog

Nâng Cấp Hiệu Năng Mô-Đun Cluster Của Skynet

Vào cuối tuần trước, tôi đã thực hiện một số cải tiến đáng kể cho mô-đun cluster của skynet - một giải pháp kết nối phân tán giúp các máy chủ trong hệ thống làm việc linh hoạt hơn. Trong kiến trúc này, mỗi máy chủ được gán một tên định danh duy nhất, cho phép các nút trong cụm truyền thông tin qua lại bằng cách sử dụng tên này như địa chỉ đích.

Việc quản lý cụm phân tán luôn là bài toán phức tạp, nhưng skynet với tư cách là một framework nhẹ đã thiết kế một kiến trúc tối giản nhưng hiệu quả. Trong mỗi tiến trình skynet, dịch vụ clusterd đóng vai trò trung tâm trong giao tiếp cụm - vừa khởi tạo cổng kết nối mạng (gate service) để lắng nghe kết nối từ các nút khác, vừa thiết lập kết nối chủ động khi cần gửi dữ liệu đi. Các API trong thư viện “cluster” sẽ xử lý việc trao đổi dữ liệu với clusterd để thực hiện các thao tác cụm.

Trong dự án MMORPG đang phát triển, chúng tôi phụ thuộc nặng vào tính năng cluster. Qua nhiều đợt test hiệu năng, chúng tôi nhận thấy clusterd là dịch vụ tiêu hao nhiều CPU nhất trong số các dịch vụ hệ thống. Đây chính là điểm nghẽn hiệu năng cần được tối ưu.

Quá trình chuyển tiếp tin nhắn trong clusterd đòi hỏi nhiều lần sao chép và serial hóa dữ liệu, gây lãng phí tài nguyên. Tôi đã tập trung tối ưu hóa bằng cách chuyển đổi sang cơ chế truyền tham chiếu bộ nhớ, tuy nhiên việc này đòi hỏi thay đổi sâu ở tầng socket - điều mà chúng tôi tạm hoãn để tránh làm phức tạp hệ thống. Thay vào đó, giải pháp hiệu quả nhất là tách biệt chức năng xử lý yêu cầu nội bộ và ngoại bộ của clusterd.

Theo triết lý thiết kế của skynet - tận dụng tối đa lợi thế đa nhân, việc phân tán công việc ra nhiều core mà không làm tăng tổng khối lượng xử lý mới là tối ưu thực sự. Tôi đã tách riêng phần xử lý kết nối ngoại vi thành dịch vụ clusteragent độc lập. Phần tiếp nhận yêu cầu từ bên ngoài không cần biết toàn bộ bảng định tuyến các nút trong cụm (vẫn do clusterd quản lý tập trung), mà chỉ cần xử lý luồng dữ liệu mạng, phân tích yêu cầu và chuyển tiếp đến dịch vụ nội bộ tương ứng.

Trong phiên bản trước, cổng kết nối gate chuyển toàn bộ dữ liệu về clusterd. Nay mỗi kết nối mạng sẽ sinh ra một instance clusteragent riêng, nhận dữ liệu từ gate và xử lý độc lập. Điều này không chỉ giảm tải cho clusterd mà còn đơn giản hóa quy trình xử lý gói tin lớn.

Kết quả test hiệu năng vào thứ Hai cho thấy cải thiện rõ rệt. Trong cấu trúc cụm đối xứng (mỗi nút có vai trò tương đương), lượng yêu cầu gửi đi và nhận về gần như cân bằng. Sau tối ưu, khối lượng xử lý của clusterd giảm còn 50% so với trước, phần còn lại được phân tán đều cho các clusteragent (số lượng bằng số nút cụm trừ đi 1).

Đặc biệt, việc tối ưu hóa thêm ở clusteragent giúp giảm 50% thời gian xử lý mỗi tin nhắn so với clusterd nguyên bản. Trên môi trường test dùng máy ảo với CPU Intel Xeon E5-2620 (24 nhân, 2GHz) - dòng chip thấp cấp trong series 26, hệ thống đạt tới 70.000 tin nhắn/giây (tương đương 35.000 QPS cho mỗi cặp nút kết nối). Cần lưu ý đây là kết quả test chưa khai thác hết tiềm năng phần cứng, vì hàng đợi tin nhắn không bị nghẽn.

Con số 35.000 QPS/giây này có thể xem là ngưỡng hiệu năng tối thiểu tham khảo cho kết nối giữa hai nút trong cụm. Thông số này phụ thuộc vào hiệu năng đơn nhân CPU chứ không phải tổng số nhân, nên việc nâng cấp lên các thế hệ CPU mới (như dòng Sapphire Rapids) sẽ mang lại cải thiện đáng kể.

Đối với các kiến trúc cụm phi đối xứng - nơi một số nút đảm nhận vai trò chuyên biệt như xác thực đăng nhập, quản lý trạng thái người chơi hay hệ thống thư tín, lợi ích từ tối ưu này còn lớn hơn nữa. Giải pháp mới giúp loại bỏ điểm nghẽn clusterd trước đây, cho phép mở rộng hệ thống hiệu quả hơn.

0%