Jika semua worker thread tertahan oleh pekerjaan lambat, permintaan baru hanya bisa menunggu tanpa kepastian.
Mengapa Worker thread tertahan karena menunggu respons API eksternal atau DB → Akibatnya Tidak ada thread yang bisa ditugaskan untuk permintaan baru → Di layar Fitur tertentu seperti login atau toko mengalami loading tanpa henti
Saat banyak pemain berkumpul, Tepat setelah login atau maintenance
Penanggung jawab
Penanggung jawab utama Pengembangan server (Tim Pengembang Game)
Tugas Tim Pengembang Game
Pasang timeout pada pemanggilan yang lambat, pisahkan thread pool per fitur, ubah ke asinkron.
Di grafik
Mendatar di batas · Jumlah thread dan panjang antrean thread pool, waktu pemrosesan permintaan
Yang diperiksa
Untuk .NET, periksa jumlah thread dan panjang antrean thread pool di dotnet-counters monitor (.NET 9 ke atas: dotnet.thread_pool.thread.count dan dotnet.thread_pool.queue.length, 8 ke bawah: ThreadPool Thread Count dan ThreadPool Queue Length), lalu cek di mana worker thread menunggu dengan dotnet-stack. Untuk JVM dan server native, cek hal yang sama dengan thread dump
Cocok jika
Utilisasi CPU jauh di bawah 100%, tetapi jumlah thread terus naik perlahan atau menempel di batas atas, antrean menumpuk, dan sebagian besar worker menunggu respons dari pemanggilan eksternal yang sama (DB, HTTP)
Tidak cocok jika
Antrean kosong tetapi tetap lambat: tujuan pemanggilannya sendiri yang lambat, jadi lebih mungkin kegagalan berantai atau ketergantungan pada layanan eksternal
Sarana pemeriksaan
Tools infrastruktur (tanpa perlu kode game)
Pelajari lebih lanjut
Pada arsitektur yang memakai worker thread pool yang sama untuk menerima paket dan menjalankan logika game, begitu beberapa pekerjaan lambat menahan semua worker, pemrosesan paket di seluruh server berhenti.
Debug ThreadPool StarvationMicrosoft Jika tidak ada thread tersisa di pool dan pekerjaan baru harus menunggu, respons melambat; penyebabnya kode blocking yang menahan thread. Di dotnet-counters, CPU jauh di bawah 100% tetapi dotnet.thread_pool.thread.count terus naik perlahan adalah tanda thread pool habis (dotnet.thread_pool.queue.length juga sering besar); tempat thread menunggu dicek dengan dotnet-stack
Avoiding insurmountable queue backlogsAWS Jumlah pemrosesan bersamaan = laju kedatangan × latensi (hukum Little). Pada 100 permintaan per detik, jika latensi naik dari 100 ms menjadi 10 detik, kebutuhan thread naik dari 10 menjadi 1.000 sehingga pool habis
Bulkhead PatternMicrosoft Azure Jika connection pool dan thread pool dipisah untuk setiap tujuan pemanggilan, gangguan di satu tujuan hanya memblokir pool miliknya
.NET runtime metrics.NET dotnet.thread_pool.thread.count (jumlah thread di thread pool) dan dotnet.thread_pool.queue.length (jumlah pekerjaan yang menunggu) tersedia sejak .NET 9
Well-known EventCounters in .NETMicrosoft ThreadPool Thread Count (threadpool-thread-count) dan ThreadPool Queue Length (threadpool-queue-length) untuk .NET 8 ke bawah