Cải Tiến Hiệu Suất Hệ Thống I/O Máy Chủ Trò Chơi Kiếm Thế Tây Du - nói dối e blog

Cải Tiến Hiệu Suất Hệ Thống I/O Máy Chủ Trò Chơi Kiếm Thế Tây Du

Cuộc trò chuyện tình cờ với các đồng nghiệp trong những ngày qua đã giúp tôi nhận ra những thách thức liên quan đến hiệu suất vận hành của hệ thống máy chủ trò chơi Kiếm Thế Tây Du. Vấn đề then chốt nằm ở việc liệu chúng ta có thể xây dựng hệ thống máy chủ theo mô hình trạm không đĩa cứng (diskless station) hoặc triển khai trong môi trường máy ảo để tối ưu hóa công tác quản trị hệ thống hay không.

Điều bất ngờ là hiện tại hiệu suất I/O đĩa cứng (disk I/O) lại trở thành điểm nghẽn chính của hệ thống, vượt qua cả CPU và băng thông mạng. Hệ thống lưu trữ dữ liệu hiện tại được thiết kế theo nguyên tắc: tiến trình trò chơi chính hoàn toàn không tham gia vào việc lưu trữ dữ liệu mà vận hành hoàn toàn trên bộ nhớ đệm (RAM). Dữ liệu người chơi được biểu diễn dưới dạng cấu trúc dữ liệu trong bộ nhớ. Khi người chơi đăng nhập, hệ thống sẽ đọc file văn bản cục bộ để nạp dữ liệu, và khi đăng xuất sẽ tuần tự hóa (serialize) dữ liệu ra file văn bản lưu trữ.

Để phòng tránh sự cố bất ngờ, hệ thống định kỳ tuần tự hóa toàn bộ dữ liệu trong bộ nhớ, sau đó thông qua cơ chế bộ nhớ chia sẻ (shared memory) để tiến trình I/O độc lập thực hiện ghi dữ liệu xuống đĩa. Thiết kế này đã được áp dụng suốt 10 năm qua, dù có thể không còn tối ưu nhưng vẫn vận hành ổn định. Khi được hỏi về hệ thống cơ sở dữ liệu sử dụng, chúng tôi thường phải giải thích rằng hệ thống hiện không dùng cơ sở dữ liệu truyền thống mà chỉ dùng hệ thống tập tin. Mặc dù nhiều người ngạc nhiên, nhưng bản thân tôi vẫn tin rằng các hệ thống SQL truyền thống không phải là lựa chọn phù hợp nhất trong trường hợp này.

Với các máy chủ có trên 8,000 người chơi đồng thời hiện nay, hoạt động I/O đĩa đã trở nên quá tải nghiêm trọng, ảnh hưởng trực tiếp đến trải nghiệm trò chơi. Qua nhiều năm sửa chữa, bổ sung, hệ thống hiện nay đã phát sinh thêm nhiều thao tác I/O phụ trợ, đều bị tác động bởi cơ chế ghi đĩa định kỳ này.

Từ trực giác kỹ thuật, tôi nhận thấy đây là khâu rất đáng để đầu tư tối ưu hóa. Việc cải thiện phần cứng trước đây đã giúp giải quyết tạm thời vấn đề, nhưng chưa có ai thực sự cải tiến kiến trúc cốt lõi vì tâm lý ngại chạm vào hệ thống đã vận hành ổn định hàng chục năm. Giải pháp khả thi là xây dựng một tầng cache bộ nhớ đệm, nơi lưu trữ tất cả dữ liệu cần truy xuất thay vì đọc trực tiếp từ đĩa. Có thể sử dụng giải pháp có sẵn hoặc tự phát triển (không quá phức tạp). Việc tự xây dựng cache sẽ tạo tiền đề thuận lợi cho các bước tối ưu hóa tiếp theo.

Điểm mấu chốt trong cải tiến nằm ở việc thay đổi cơ chế lưu trữ định kỳ: Thay vì ghi toàn bộ dữ liệu, chúng ta chỉ cần lưu trữ sự khác biệt (delta) giữa các phiên bản dữ liệu. Đây là phương pháp tối ưu phổ biến, nhưng việc áp dụng vào hệ thống hiện tại đòi hỏi giải pháp tùy chỉnh. Các công cụ diff truyền thống dựa trên phân tích dòng văn bản không phù hợp với cấu trúc dữ liệu của chúng ta - là các đoạn văn bản có định dạng không chuẩn, dấu hiệu rõ ràng của quá trình phát triển lâu dài. Đặc biệt, một số dòng văn bản có độ dài lên đến hàng nghìn byte, khiến các phương pháp diff dòng truyền thống không hiệu quả.

Với quy mô dữ liệu hàng vạn người chơi, mỗi bản ghi dưới 48KB, tổng lượng dữ liệu mỗi đợt lên đến hàng trăm MB. Việc sử dụng công cụ độc lập sẽ tạo ra chi phí truyền tải đáng kể. Một giải pháp tùy chỉnh chuyên dụng là lựa chọn tối ưu nhất. Với tầm quan trọng của Kiếm Thế Tây Du - sản phẩm mang về hàng tỷ NDT doanh thu mỗi tháng cho NetEase, chi phí phát triển giải pháp nhỏ này hoàn toàn có thể bỏ qua nếu tính đến yếu tố ổn định và hiệu quả dài hạn.

Trong hai ngày qua, tôi đã xây dựng một chương trình viết bằng C khoảng 300 dòng để thực nghiệm giải thuật diff tùy chỉnh. Thay vì phân đoạn theo ký tự xuống dòng truyền thống, chương trình cho phép định nghĩa các dấu phân cách linh hoạt. Mỗi khối dữ liệu văn bản 40-50KB của người chơi được chia thành khoảng 2,000 thành phần dữ liệu nhỏ, sau đó áp dụng thuật toán diff tiêu chuẩn để xử lý.

Hiệu suất đạt được khá khả quan: mỗi giây xử lý được khoảng 20 bộ dữ liệu người chơi. Với thời gian chơi trung bình mỗi ván khoảng 30 phút, lượng dữ liệu khác biệt chỉ chiếm khoảng 10% tổng lượng dữ liệu. Trên các máy chủ tiêu chuẩn 8 nhân hiện nay, thường dư thừa vài nhân CPU không sử dụng, hoàn toàn có thể tận dụng để thực hiện tính toán diff. Giải pháp này có thể giảm đến 90% hoạt động I/O đĩa, nếu kết hợp thêm nén dữ liệu hiệu quả sẽ còn cao hơn nữa. Kết quả tối ưu hóa dự kiến sẽ mang lại cải thiện rõ rệt cho hệ thống.

0%