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

Buku Putih Lag Game › L9 Proses game di server

Thread pool habis Thread pool starvation

ID penyebab sp-threadpool · Penanggung jawab utama Pengembangan server (Tim Pengembang Game)

Buka kartu interaktif dengan gambar dan simulasi →

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

Gejala
Tidak bisa masuk / loading tanpa henti, Input lag, Freeze
Faktor
Stall
Siapa yang mengalami
Fitur tertentu saja, Seluruh server
Kapan
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.
Kasus nyata
Riot Games 2021: Gangguan 5 jam di League of Legends EUW: satu DB pendukung menghentikan seluruh server

Sumber

  1. Debug ThreadPool Starvation Microsoft
    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
  2. Avoiding insurmountable queue backlogs AWS
    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
  3. Bulkhead Pattern Microsoft Azure
    Jika connection pool dan thread pool dipisah untuk setiap tujuan pemanggilan, gangguan di satu tujuan hanya memblokir pool miliknya
  4. .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
  5. Well-known EventCounters in .NET Microsoft
    ThreadPool Thread Count (threadpool-thread-count) dan ThreadPool Queue Length (threadpool-queue-length) untuk .NET 8 ke bawah

Lihat juga

Lapisan yang sama: L9 Proses game di server

Penyebab di lapisan lain dengan gejala yang sama (Tidak bisa masuk / loading tanpa henti)

Lihat kartu interaktif dengan gambar dan simulasi