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
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
Runtime locking correctness validatorLinux 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
Liveness, Readiness, and Startup ProbesKubernetes 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