한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

Sách trắng lag game › L12 Cơ sở dữ liệu

Đăng nhập ồ ạt và query N+1 Login storm, N+1 queries

ID nguyên nhân db-login-storm · Phụ trách chính Phát triển server (Đội phát triển game) · Phối hợp Hạ tầng DB (Đội hạ tầng)

Mở thẻ gốc có hình minh họa và thí nghiệm →

Nếu tải một nhân vật mà phải truy vấn riêng lẻ vài chục lần, thì vài chục nghìn người đăng nhập cùng lúc sẽ thành hàng triệu query.

Vì sao Khi tải nhân vật, truy vấn vật phẩm, skill, nhiệm vụ riêng từng thứ một → Dẫn đến Ngay sau bảo trì, đăng nhập đồng thời làm số query tăng vọt → Trên màn hình Đăng nhập kẹt loading, việc lưu của người đang chơi cũng bị dồn lại

Triệu chứng
Không vào được·kẹt loading, Trễ thao tác
Yếu tố
Ngưng trệ, Độ trễ
Ai gặp phải
Cả server
Khi nào
Ngay sau đăng nhập hoặc bảo trì
Phụ trách
Phụ trách chính Phát triển server (Đội phát triển game) · Phối hợp Hạ tầng DB (Đội hạ tầng)
Việc cần làm (Đội phát triển game)
Gộp thành một lần truy vấn, hàng chờ đăng nhập, cache, kiểm tra số truy vấn do lazy loading của ORM sinh ra.
Việc cần làm (Đội hạ tầng)
Lập bảng xếp hạng các query bị gọi nhiều nhất và chia sẻ, giám sát số query và số kết nối trong khung giờ đăng nhập ngay sau bảo trì.
Trên đồ thị
Tăng vọt ngay sau đăng nhập hoặc bảo trì · Số query mỗi giây của DB, số lượt đăng nhập
Chỗ cần xem
Đặt chồng số lượt đăng nhập ngay sau bảo trì với số query mỗi giây của DB (MySQL: mức tăng của Questions) và tính số query cho mỗi lượt đăng nhập. Lấy các query bị gọi nhiều nhất từ COUNT_STAR trong events_statements_summary_by_digest của MySQL, calls trong pg_stat_statements của PostgreSQL
Đúng nếu
mỗi lượt đăng nhập tốn vài chục query, và các query đứng đầu là những query ngắn cùng dạng, truy vấn theo một ID nhân vật. Nếu số query mỗi lượt đăng nhập tăng sau bản cập nhật thì bản cập nhật đó là điểm xuất phát
Loại trừ nếu
số query mỗi lượt đăng nhập ít mà từng query đều chậm → cache lạnh (db-cold-cache) hoặc index (db-no-index)
Cách kiểm tra
Kiểm tra bằng công cụ hạ tầng (không cần code game)
Tìm hiểu thêm
Lazy loading của ORM (thư viện tự sinh truy vấn DB thay cho lập trình viên) tạo ra kiểu truy vấn này mà chính lập trình viên cũng không hay biết. Trên server dev chỉ có vài nhân vật nên không lộ ra, đến khi đăng nhập đồng thời trên môi trường live mới bộc lộ lần đầu.

Nguồn

  1. Efficient Querying .NET
    Lazy loading của ORM gửi thêm một query cho mỗi phần tử, sinh ra vấn đề N+1 làm hiệu năng giảm mạnh; khuyến nghị nạp gộp một lần (eager loading)
  2. pg_stat_statements — track statistics of SQL planning and execution PostgreSQL
    Thu thập số lần chạy (calls) và tổng thời gian chạy theo từng câu lệnh để xếp hạng các query bị gọi nhiều
  3. Performance Schema Statement Digests and Sampling MySQL
    events_statements_summary_by_digest gộp các query cùng dạng để thống kê số lần và thời gian
  4. Statement Summary Tables MySQL
    COUNT_STAR (số lần chạy) và SUM_TIMER_WAIT (tổng thời gian) trong bảng tổng hợp
  5. Server Status Variables MySQL
    Questions: số câu lệnh client đã gửi

Nguyên nhân nên xem cùng

Cùng tầng: L12 Cơ sở dữ liệu

Nguyên nhân ở tầng khác gây cùng triệu chứng (Không vào được·kẹt loading)

Xem thẻ gốc có hình minh họa và thí nghiệm