Jika beberapa thread menunggu satu lock untuk menulis data yang sama, walaupun thread ditambah, hanya satu yang berjalan pada satu waktu.
Mengapa Beberapa thread memakai data bersama secara bersamaan, misalnya balai lelang atau gudang guild → Akibatnya Thread lain menunggu sampai thread yang memegang lock selesai → Di layar Hanya fitur tertentu yang lambat; jika parah, tick seluruh server tertunda
Penanggung jawab utama Pengembangan server (Tim Pengembang Game)
Tugas Tim Pengembang Game
Pecah lock menjadi lebih kecil, kurangi pekerjaan di dalam lock, gunakan arsitektur berbasis pesan (tetapkan thread penanggung jawab untuk setiap data, thread lain hanya mengirim permintaan lewat pesan).
Kisaran angka
Jika pekerjaan di dalam lock 20% dari total, throughput maksimal hanya 5 kali throughput satu thread berapa pun thread ditambah; jika 40%, berhenti di 2,5 kali.
Di grafik
Naik mengikuti beban · Waktu pemrosesan permintaan, CPU dan context switching per thread
Yang diperiksa
Periksa context switching voluntary per thread (cswch/s, jumlah thread berhenti karena menunggu sumber daya) dengan pidstat -w -t 1, dan di mana thread menunggu setelah meninggalkan CPU (waktu tunggu per call stack) dengan bcc offcputime -p. Untuk .NET, periksa jumlah lock contention di dotnet-counters (.NET 9 ke atas: dotnet.monitor.lock_contentions, 8 ke bawah: Monitor Lock Contention Count)
Cocok jika
Beban naik tetapi utilisasi CPU tetap rendah sementara waktu pemrosesan naik, sebagian besar waktu tunggu terkumpul di call stack yang mencoba mengambil lock, dan jumlah lock contention ikut naik
Tidak cocok jika
CPU penuh: masalah volume komputasi (tick melewati budget, kelebihan beban di area single-thread). Tempat menunggunya pemanggilan DB atau file: lebih mungkin pemanggilan sinkron di thread game
Sarana pemeriksaan
Tools infrastruktur (tanpa perlu kode game)
Pelajari lebih lanjut
Masalah ini muncul pada arsitektur yang membuat beberapa thread mengubah data game bersama-sama. Arsitektur yang menugaskan satu thread per area atau fitur dan hanya bertukar pesan hampir tidak memakai lock, tetapi harus waspada terhadap pekerjaan yang menumpuk di satu thread (kelebihan beban di area single-thread). Jika thread game menunggu lock yang dipegang oleh operasi penyimpanan yang lambat, seluruh tick itu berhenti.
Amdahl's Law in the Multicore EraIEEE Paper IEEE Computer 2008 (versi yang dipublikasikan penulis). Jika porsi yang tidak bisa diparalelkan adalah 1−f, berapa pun core ditambah, percepatannya tidak bisa melewati 1/(1−f) (hukum Amdahl)
Request schedulingMicrosoft Grain (actor) di Orleans memakai model eksekusi single-thread yang memproses permintaan satu per satu sampai selesai, sehingga state tidak diubah bersamaan; jika saling menunggu respons, deadlock bisa terjadi
pidstat(1) — Linux manual pagesysstat cswch/s pada -w adalah jumlah context switching voluntary karena menunggu sumber daya, -t untuk menampilkan per thread
Well-known EventCounters in .NETMicrosoft Monitor Lock Contention Count (monitor-lock-contention-count): jumlah lock contention yang terjadi saat mencoba mengambil monitor lock
.NET runtime metrics.NET dotnet.monitor.lock_contentions sejak .NET 9: jumlah lock contention yang terjadi saat mencoba mengambil monitor lock sejak proses dimulai