Vấn Đề Về Máy Chủ Dream Journey IO - nói dối e blog

Vấn Đề Về Máy Chủ Dream Journey IO

Vấn đề I/O trên máy chủ game Đại Mộng Tây Du

Khi công nghệ đa nhân đã giải quyết triệt để bài toán hiệu năng CPU, khi hệ điều hành 64-bit đã xóa bỏ giới hạn bộ nhớ, thì vấn đề I/O đĩa vẫn là cơn ác mộng hành hạ các kỹ sư vận hành. Hệ thống máy chủ của Đại Mộng Tây Du, kế thừa kiến trúc từ các thế hệ tiền nhiệm, đã vận hành liên tục suốt một thập kỷ. Trong giai đoạn đầu phát triển, do áp lực ra mắt nhanh, đội ngũ kỹ thuật đã chọn giải pháp đơn giản nhất để đảm bảo tính ổn định. Hậu quả là để lại hàng loạt “di sản” công nghệ, trong đó nổi bật là việc sử dụng tràn lan thao tác ghi/đọc đĩa trong các kịch bản logic.

Đỉnh điểm của vấn đề xảy ra khi các thao tác I/O chất đống lên nhau theo cơ chế đồng bộ. Dù hiệu năng xử lý tổng thể của hệ thống không suy giảm, nhưng thời gian phản hồi với người dùng lại kéo dài đáng kể. Phân tích kỹ lưỡng cho thấy hệ thống sử dụng đĩa cứng cho hai mục đích hoàn toàn khác biệt:

Thứ nhất là yêu cầu sao lưu dữ liệu định kỳ. Với hàng trăm máy chủ vận hành liên tục, tỷ lệ hỏng hóc phần cứng lên tới 1-2 lần/tuần. Để tránh mất mát dữ liệu nghiêm trọng khi xảy ra sự cố, hệ thống buộc phải thực hiện sao lưu không ít hơn 30 phút/lần.

Thứ hai là nhu cầu trao đổi dữ liệu trong quá trình xử lý game. Do logic trò chơi được xây dựng theo kiểu “chắp vá” để đáp ứng nhanh các tính năng mới, nhiều kịch bản script đọc/ghi file một cách tùy tiện, thậm chí sử dụng cơ chế đồng bộ. Điều này khiến toàn bộ tiến trình xử lý logic game bị serialize tại điểm truy cập đĩa, tạo thành cổ chai nghẽn mạng.

Theo dõi hệ thống cho thấy trong giai đoạn cao điểm ghi dữ liệu sao lưu, các thao tác đọc file đơn giản có thể kéo dài 1-2 giây dù dung lượng file rất nhỏ. Nguyên nhân chính nằm ở hàng đợi I/O bị nghẽn do hàng loạt tác vụ ghi đĩa chưa hoàn thành. Về mặt lý thuyết, các thao tác ghi nên được xếp vào hàng đợi với độ ưu tiên thấp, để các thao tác đọc có thể thực hiện ngay lập tức. Điều này đòi hỏi cơ chế “đẩy” dữ liệu từ cache bộ nhớ xuống đĩa phải được trì hoãn, nhường chỗ cho các yêu cầu đọc khẩn cấp.

Giải pháp sáng tạo được đề xuất như sau:

  1. Phân tách hai loại I/O bằng cách sử dụng hai thiết bị lưu trữ độc lập - một ổ cứng vật lý cho dữ liệu hoạt động và một thiết bị mạng (NAS/SAN) cho sao lưu.
  2. Tạo một phân vùng RAM disk tại thời điểm khởi động hệ thống.

Từ đó hình thành ba phân vùng logic:

  • R (RAM disk): Bộ đệm truy cập nhanh
  • D (Data disk): Ổ dữ liệu hoạt động (chỉ đọc)
  • B (Backup disk): Ổ sao lưu (chỉ ghi)

Quy trình vận hành:

  • Trước khởi động: Đồng bộ dữ liệu từ B sang D, sau đó sao chép dữ liệu mới nhất từ B sang R (giữ trống 20% dung lượng)
  • Trong vận hành:
    • Đọc file: Ưu tiên từ R → nếu không có thì lấy từ D và đồng thời copy sang R
    • Ghi file: Ghi vào R trước, sau đó một tiến trình nền bất đồng bộ sao chép sang B
  • Khi tắt máy: Đồng bộ toàn bộ dữ liệu từ R sang D
  • Trường hợp sự cố: Sử dụng script đồng bộ B→D trước khi khởi động lại

Giải pháp này hiệu quả nhờ nguyên tắc tách biệt rõ ràng: D chỉ cho phép đọc, B chỉ cho phép ghi, còn R đóng vai trò cache thông minh đảm bảo nhất quán dữ liệu. Dù vậy, cần xử lý kịch bản đầy bộ nhớ cache R bằng cách:

  • Khi R đầy, cho phép ghi trực tiếp xuống D (vi phạm nguyên tắc read-only nhưng kiểm soát được)
  • Sử dụng script dọn dẹp định kỳ vào khung giờ ít truy cập (2-4h sáng), loại bỏ các file cũ trên R và ghi xuống D

Ưu điểm vượt trội của phương pháp này là giảm 80% độ trễ I/O trong giờ cao điểm, đồng thời đảm bảo tính toàn vẹn dữ liệu ngay cả khi xảy ra sự cố phần cứng bất ngờ. Đây là minh chứng cho việc giải quyết vấn đề kỹ thuật không nhất thiết phải thay đổi toàn bộ kiến trúc, mà có thể sáng tạo từ việc tổ chức lại luồng dữ liệu một cách thông minh.

0%