Khi mọi worker thread xử lý việc đều bị kẹt ở các việc chậm, yêu cầu mới chỉ biết chờ vô thời hạn.
Vì sao Các worker thread bị kẹt chờ phản hồi từ API bên ngoài hoặc DB → Dẫn đến Yêu cầu mới không còn thread nào để nhận → Trên màn hình Kẹt loading ở một số tính năng như đăng nhập hoặc cửa hàng
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)
Đặt timeout cho lời gọi chậm, tách thread pool theo tính năng, chuyển sang bất đồng bộ.
Trên đồ thị
Chạm giới hạn rồi đi ngang · Số thread và độ dài hàng đợi của thread pool, thời gian xử lý yêu cầu
Chỗ cần xem
Với .NET, số thread và độ dài hàng đợi của thread pool trong dotnet-counters monitor (dotnet.thread_pool.thread.count và dotnet.thread_pool.queue.length từ .NET 9, ThreadPool Thread Count và ThreadPool Queue Length ở bản 8 trở xuống), và dùng dotnet-stack xem worker thread đang chờ ở đâu. Với JVM và server native, xem tương tự bằng thread dump
Đúng nếu
mức sử dụng CPU thấp hơn 100% nhiều nhưng số thread cứ tăng dần hoặc dính ở mức trần, hàng đợi dồn lên, và phần lớn worker đang chờ phản hồi của cùng một lời gọi ra ngoài (DB, HTTP)
Loại trừ nếu
hàng đợi trống mà vẫn chậm → chính dịch vụ được gọi đang chậm, xem sự cố dây chuyền hoặc phụ thuộc vào dịch vụ bên ngoài
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
Nếu việc nhận gói tin và logic game dùng chung một worker thread pool, thì ngay lúc vài việc chậm chiếm hết worker, việc xử lý gói tin của cả server dừng lại.
Debug ThreadPool StarvationMicrosoft Pool hết thread, việc mới phải chờ nên phản hồi chậm; nguyên nhân là code blocking chiếm giữ thread. Trong dotnet-counters, CPU thấp hơn 100% nhiều mà dotnet.thread_pool.thread.count cứ tăng dần là dấu hiệu cạn pool (dotnet.thread_pool.queue.length thường cũng lớn); dùng dotnet-stack xem thread chờ ở đâu
Avoiding insurmountable queue backlogsAWS Số yêu cầu xử lý đồng thời = tốc độ đến × độ trễ (định luật Little). Với 100 yêu cầu mỗi giây, độ trễ tăng từ 100 ms lên 10 giây thì 10 thread thành 1.000 thread và pool cạn
Bulkhead PatternMicrosoft Azure Tách riêng connection pool và thread pool cho từng dịch vụ được gọi thì sự cố của một dịch vụ chỉ chặn pool của nó
.NET runtime metrics.NET dotnet.thread_pool.thread.count (số thread của thread pool) và dotnet.thread_pool.queue.length (số việc đang chờ) có từ .NET 9
Well-known EventCounters in .NETMicrosoft ThreadPool Thread Count (threadpool-thread-count) và ThreadPool Queue Length (threadpool-queue-length) ở .NET 8 trở xuống