한국어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

Cạn thread pool Thread pool starvation

ID nguyên nhân sp-threadpool · 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 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

Triệu chứng
Không vào được·kẹt loading, Trễ thao tác, Đứng hình
Yếu tố
Ngưng trệ
Ai gặp phải
Chỉ một tính năng, Cả server
Khi nào
Khi đông người, Ngay sau đăng nhập hoặc bảo trì
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)
Đặ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.
Sự cố thực tế
Riot Games 2021: Sự cố 5 giờ ở League of Legends EUW: một DB phụ làm tê liệt toàn bộ server

Nguồn

  1. Debug ThreadPool Starvation Microsoft
    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
  2. Avoiding insurmountable queue backlogs AWS
    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
  3. Bulkhead Pattern Microsoft 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ó
  4. .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
  5. Well-known EventCounters in .NET Microsoft
    ThreadPool Thread Count (threadpool-thread-count) và ThreadPool Queue Length (threadpool-queue-length) ở .NET 8 trở xuống

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 (Không vào được·kẹt loading)

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