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

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

Tác vụ batch khối lượng lớn Batch jobs during service

ID nguyên nhân db-batch · 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 chạy tổng hợp bảng xếp hạng, gửi thư hàng loạt hay dọn dữ liệu cũ trong lúc đang vận hành, các tác vụ này sẽ chiếm khóa và ổ đĩa.

Vì sao Chạy tác vụ khối lượng lớn trong giờ vận hành → Dẫn đến Khóa phạm vi rộng, chiếm ổ đĩa và CPU → Trên màn hình Giao dịch và lưu thất bại vào một khung giờ nhất định, loading chậm

Triệu chứng
Trễ thao tác, Nuốt thao tác·rollback
Yếu tố
Độ trễ, Ngưng trệ
Ai gặp phải
Chỉ một tính năng, Cả server
Khi nào
Theo chu kỳ đều
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)
Chia nhỏ để chạy từng ít một, tổng hợp trên bản sao.
Việc cần làm (Đội hạ tầng)
Cung cấp bản sao dành cho tổng hợp, lên lịch batch vào khung giờ vắng, theo dõi lock escalation và chờ gap lock.
Trên đồ thị
Vọt lên theo chu kỳ · Độ trễ query DB, chờ khóa
Chỗ cần xem
Tìm query dài đang chạy vào lúc lag. MySQL: xem slow query log; PostgreSQL: xem query_start, query trong pg_stat_activity; rồi đối chiếu với chỉ số chờ khóa cùng thời điểm và lịch batch (cron, event scheduler của DB). SQL Server: ghi lại lock escalation bằng extended event lock_escalation
Đúng nếu
lần nào cũng vào cùng một giờ có UPDATE, DELETE hoặc query tổng hợp khối lượng lớn chạy, và trong lúc đó chờ khóa cùng mức sử dụng ổ đĩa đều tăng
Loại trừ nếu
lúc đó không có query dài nào → checkpoint (db-checkpoint) hoặc sao lưu server (dk-backup)
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
SQL Server đổi sang khóa cả bảng khi một câu lệnh giữ quá khoảng 5.000 khóa dòng (lock escalation). Ngay lúc đó, mọi yêu cầu dùng cùng bảng đều bị dừng. MySQL với cấu hình mặc định, khi sửa theo điều kiện phạm vi, cũng khóa cả khoảng trống giữa các dòng (gap lock), chặn việc thêm dòng mới.

Nguồn

  1. Transaction Locking and Row Versioning Guide Microsoft SQL Server
    Khi một câu lệnh giữ từ 5.000 khóa trở lên trên một bảng (hoặc index) thì xảy ra lock escalation, được ghi lại bằng extended event lock_escalation
  2. InnoDB Locking MySQL
    Ở mức cô lập mặc định REPEATABLE READ của InnoDB, tìm kiếm và quét dùng next-key lock, nên gap lock chặn việc thêm dòng mới vào khoảng trống đó
  3. The Slow Query Log MySQL
    Ghi các query vượt long_query_time kèm thời gian chạy (Query_time), thời gian khóa (Lock_time), số dòng đã đọc
  4. The Cumulative Statistics System (PostgreSQL Documentation) PostgreSQL
    pg_stat_activity: query đang chạy (query) và thời điểm bắt đầu (query_start) của từng session

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 (Trễ thao tác)

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