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

Sách trắng lag game › L9 Tiến trình game phía server

Deadlock Deadlock

ID nguyên nhân sp-deadlock · Phụ trách chính 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 hai thread chờ lock mà bên kia đang giữ, cả hai sẽ đứng mãi mãi.

Vì sao Thread A giữ lock 1 và chờ lock 2, B giữ lock 2 và chờ lock 1 → Dẫn đến Cả hai đứng mãi mãi, các thread liên quan cũng lần lượt đứng theo → Trên màn hình Cả server ngừng hoạt động, watchdog khởi động lại nên mọi người đều mất kết nối

Triệu chứng
Đứng hình, Mất kết nối
Yếu tố
Ngưng trệ
Ai gặp phải
Cả server, Chỉ một tính năng
Khi nào
Thỉnh thoảng bất chợt, Khi đông người
Phụ trách
Phụ trách chính Phát triển server (Đội phát triển game)
Việc cần làm (Đội phát triển game)
Quy tắc thứ tự lấy lock, dùng lock có timeout, dùng watchdog và lưu thread dump ngay lúc bị treo.
Trên đồ thị
Rớt kết nối hàng loạt · Số kết nối, lượng gửi của server
Chỗ cần xem
Chụp call stack của mọi thread trong lúc bị treo. JVM dùng jstack (tự tìm và đánh dấu deadlock), .NET dùng dotnet-stack, server native dùng thread apply all bt của gdb, hoặc dùng gcore tạo file core rồi khởi động lại và phân tích sau
Đúng nếu
có từ hai thread trở lên đứng với stack đang chờ lock mà bên kia giữ, và suốt lúc đó mức sử dụng CPU của tiến trình gần 0
Loại trừ nếu
trong lúc treo có một thread chạy 100% CPU → vòng lặp vô hạn. Các thread đang chờ phản hồi từ DB hoặc bên ngoài → gọi đồng bộ hoặc cạn thread pool
Cách kiểm tra
Kiểm tra bằng công cụ hạ tầng (không cần code game)

Nguồn

  1. Runtime locking correctness validator Linux kernel
    Lấy hai lock theo thứ tự ngược nhau sẽ gây chờ vòng tròn và deadlock (lock inversion deadlock); kernel Linux kiểm tra thứ tự lock và cảnh báo trước
  2. Liveness, Readiness, and Startup Probes Kubernetes
    Liveness probe phát hiện trạng thái deadlock (vẫn đang chạy nhưng không tiến triển được) và khởi động lại container
  3. Diagnostic Tools (Java SE 21 Troubleshooting Guide) Oracle
    jstack in stack của mọi thread trong JVM đang chạy, đồng thời tìm và đánh dấu deadlock (Found one Java-level deadlock)
  4. dotnet-stack diagnostic tool - .NET CLI Microsoft
    Chụp và in managed stack của mọi thread trong tiến trình .NET
  5. Threads (Debugging with GDB) GNU Project
    thread apply all chạy cùng một lệnh (bt: in call stack) trên mọi thread
  6. gcore(1) — Linux manual page gdb
    Tạo file core của chương trình đang chạy, và sau khi tạo xong chương trình vẫn tiếp tục chạy

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

Cùng tầng: L9 Tiến trình game phía server

Nguyên nhân ở tầng khác gây cùng triệu chứng (Đứng hình)

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