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

Buku Putih Lag Game › L12 Database

Perebutan lock pada hot row Hot row lock contention

ID penyebab db-hot-row · Penanggung jawab utama Pengembangan server (Tim Pengembang Game) · Turut terlibat Infrastruktur DB (Tim Infrastruktur)

Buka kartu interaktif dengan gambar dan simulasi →

Jika semua orang ingin mengubah baris yang sama (gudang guild, item populer di balai lelang, counter untuk seluruh server), lock hanya didapat satu per satu.

Mengapa Perubahan menumpuk pada baris yang sama karena event atau item populer → Akibatnya Request menunggu sampai mendapat lock → Di layar Trade gagal, “Coba lagi nanti”, timeout

Gejala
Aksi hilang / rollback, Input lag
Faktor
Stall, Latensi
Siapa yang mengalami
Fitur tertentu saja
Kapan
Saat banyak pemain berkumpul
Penanggung jawab
Penanggung jawab utama Pengembangan server (Tim Pengembang Game) · Turut terlibat Infrastruktur DB (Tim Infrastruktur)
Tugas Tim Pengembang Game
Pecah barisnya (sharded counter), persingkat transaksi, kumpulkan perubahan di memori lalu terapkan sekaligus.
Tugas Tim Infrastruktur
Pantau waktu tunggu row lock dan jumlah kejadiannya, temukan baris yang paling diperebutkan, lalu bagikan.
Kisaran angka
Jika satu request memegang lock selama 10 ms, baris itu hanya bisa diubah maksimal 100 kali per detik. Jika di dalam transaksi ada round-trip ke server lain, angka itu makin kecil sebanding dengan lamanya.
Di grafik
Naik mengikuti beban · Jumlah dan waktu tunggu row lock
Yang diperiksa
MySQL: periksa kenaikan Innodb_row_lock_waits dan Innodb_row_lock_time serta Innodb_row_lock_current_waits, lalu cari siapa menunggu siapa dengan sys.innodb_lock_waits. PostgreSQL: periksa sesi dengan wait_event_type Lock di pg_stat_activity dan request dengan granted bernilai false di pg_locks; jika log_lock_waits (default nonaktif) diaktifkan, lock yang ditunggu lama tercatat di log
Cocok jika
Jumlah request yang menunggu lock naik tajam mengikuti event dan jumlah pemain, dan sebagian besar request yang menunggu mengarah ke baris yang sama (key yang sama) di tabel yang sama
Tidak cocok jika
Request yang menunggu tersebar merata di banyak tabel dan baris: lebih mungkin disk atau CPU jenuh. Satu sesi memegang lock lama dan tidak melepasnya: lebih mungkin transaksi yang terbuka lama (db-long-tx)
Sarana pemeriksaan
Tools infrastruktur (tanpa perlu kode game)

Sumber

  1. InnoDB Locking MySQL
    Jika satu transaksi mengunci sebuah baris (index record), transaksi lain tidak bisa mengubah baris itu dan harus menunggu
  2. How to Minimize and Handle Deadlocks MySQL
    Anjuran untuk menjaga transaksi tetap kecil dan singkat serta segera commit setelah perubahan terkait agar konflik berkurang
  3. Server Status Variables MySQL
    Innodb_row_lock_waits dan Innodb_row_lock_time menunjukkan jumlah dan waktu tunggu row lock; Innodb_row_lock_current_waits menunjukkan jumlah yang sedang menunggu
  4. The innodb_lock_waits and x$innodb_lock_waits Views MySQL
    Query yang menunggu (waiting_query), sesi yang memblokir (blocking_pid), dan lama menunggu (wait_age)
  5. The Cumulative Statistics System (PostgreSQL Documentation) PostgreSQL
    wait_event_type di pg_stat_activity: Lock berarti sedang menunggu heavyweight lock
  6. pg_locks (PostgreSQL Documentation) PostgreSQL
    granted bernilai false berarti proses itu sedang menunggu untuk mendapatkan lock
  7. Error Reporting and Logging (PostgreSQL Documentation) PostgreSQL
    log_lock_waits: mencatat log jika menunggu lock lebih lama dari deadlock_timeout; default nonaktif

Lihat juga

Lapisan yang sama: L12 Database

Penyebab di lapisan lain dengan gejala yang sama (Aksi hilang / rollback)

Lihat kartu interaktif dengan gambar dan simulasi