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

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

Cache lạnh (ngay sau khởi động lại) Cold buffer pool after restart

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

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

Khi DB khởi động lại, cache trong bộ nhớ trống trơn, nên một thời gian mọi truy vấn đều phải đọc từ ổ đĩa.

Vì sao DB khởi động lại trong đợt bảo trì → Dẫn đến Dữ liệu hay dùng không có trong bộ nhớ nên phải đọc từ ổ đĩa → Trên màn hình Ngay sau bảo trì, đăng nhập và loading chậm một thời gian

Triệu chứng
Không vào được·kẹt loading, Trễ thao tác
Yếu tố
Độ 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 Hạ tầng DB (Đội hạ tầng) · Phối hợp Phát triển server (Đội phát triển game)
Việc cần làm (Đội phát triển game)
Mở cửa từ từ (dùng hàng chờ đăng nhập để tăng dần số người vào game).
Việc cần làm (Đội hạ tầng)
Làm nóng cache sau khi khởi động lại (warm-up, kiểm tra cấu hình lưu và khôi phục buffer pool), với DB khôi phục từ snapshot thì đọc trước cả ổ đĩa.
Trên đồ thị
Tăng vọt ngay sau đăng nhập hoặc bảo trì · Lượng đọc ổ đĩa, tỷ lệ hit của buffer cache
Chỗ cần xem
MySQL: xem tỷ lệ giữa Innodb_buffer_pool_reads (số lần phải đọc từ ổ đĩa vì không có trong buffer pool) và Innodb_buffer_pool_read_requests, tiến độ làm nóng Innodb_buffer_pool_load_status. PostgreSQL: xem blks_read, blks_hit trong pg_stat_database. Xem cả số lần đọc ổ đĩa của server DB
Đúng nếu
ngay sau khi khởi động lại, lượng đọc ổ đĩa vọt lên và tỷ lệ hit thấp rồi dần hồi phục, và trong khoảng đó đăng nhập, loading chậm
Loại trừ nếu
tỷ lệ hit như bình thường mà ngay sau bảo trì vẫn chậm → đăng nhập ồ ạt, N+1 (db-login-storm) hoặc connection pool (db-pool)
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
MySQL lưu danh sách page trong buffer pool khi tắt, rồi đọc lại ở chế độ chạy nền khi bật, nhưng phải mất thời gian mới nạp đầy. Nếu DB trên cloud được khôi phục từ snapshot (bản sao ổ đĩa), bản thân ổ đĩa cũng chậm ở mỗi block đọc lần đầu nên tình trạng kéo dài hơn.
Sự cố thực tế
Roblox 2021: Sự cố 73 giờ của Roblox: tranh chấp trong cụm service discovery (Consul)

Nguồn

  1. Saving and Restoring the Buffer Pool State MySQL
    Để rút ngắn thời gian làm nóng sau khi khởi động lại, khi tắt thì lưu danh sách các page dùng gần đây (mặc định 25%), khi bật thì đọc lại; cả hai đều bật mặc định
  2. pg_prewarm — preload relation data into buffer caches PostgreSQL
    Định kỳ ghi lại nội dung shared buffer, rồi nạp lại sau khi khởi động lại (autoprewarm)
  3. Initialize Amazon EBS volumes AWS
    Volume tạo từ snapshot có độ trễ tăng và hiệu năng giảm cho đến khi tải về hết mọi block
  4. Server Status Variables MySQL
    Innodb_buffer_pool_reads (số lần đọc logic không có trong buffer pool nên phải đọc thẳng từ ổ đĩa), Innodb_buffer_pool_read_requests, Innodb_buffer_pool_load_status (tiến độ làm nóng)
  5. The Cumulative Statistics System (PostgreSQL Documentation) PostgreSQL
    blks_read (số block đọc từ ổ đĩa) và blks_hit (số block tìm thấy trong buffer cache) trong pg_stat_database

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