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

Buku Putih Lag Game › L12 Database

Lonjakan login dan N+1 query Login storm, N+1 queries

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

Buka kartu interaktif dengan gambar dan simulasi →

Jika memuat satu karakter butuh puluhan query terpisah, login bersamaan puluhan ribu pemain berubah menjadi jutaan query.

Mengapa Saat memuat karakter, item, skill, dan quest diambil dengan query terpisah satu per satu → Akibatnya Tepat setelah maintenance, login bersamaan membuat jumlah query melonjak → Di layar Loading tanpa henti saat login, penyimpanan pemain yang sedang bermain pun ikut tertunda

Gejala
Tidak bisa masuk / loading tanpa henti, Input lag
Faktor
Stall, Latensi
Siapa yang mengalami
Seluruh server
Kapan
Tepat setelah login atau maintenance
Penanggung jawab
Penanggung jawab utama Pengembangan server (Tim Pengembang Game) · Turut terlibat Infrastruktur DB (Tim Infrastruktur)
Tugas Tim Pengembang Game
Gabungkan query agar data diambil sekaligus, gunakan antrean login dan cache, periksa jumlah query yang dihasilkan lazy loading ORM.
Tugas Tim Infrastruktur
Buat peringkat query dengan jumlah pemanggilan terbanyak lalu bagikan, pantau jumlah query dan koneksi pada jam login tepat setelah maintenance.
Di grafik
Melonjak tepat setelah server dibuka · Jumlah query DB per detik, jumlah login
Yang diperiksa
Tumpangkan jumlah login tepat setelah maintenance dengan jumlah query DB per detik (MySQL: kenaikan Questions), lalu hitung jumlah query per satu login. Ambil query dengan jumlah pemanggilan teratas dari COUNT_STAR di events_statements_summary_by_digest (MySQL) atau calls di pg_stat_statements (PostgreSQL)
Cocok jika
Satu login menghasilkan puluhan query, dan query teratas adalah query pendek berpola sama yang mencari berdasarkan satu ID karakter. Jika jumlah query per login naik setelah patch, patch itulah titik awalnya
Tidak cocok jika
Jumlah query per login sedikit tetapi setiap query lambat: lebih mungkin cold cache (db-cold-cache) atau indeks (db-no-index)
Sarana pemeriksaan
Tools infrastruktur (tanpa perlu kode game)
Pelajari lebih lanjut
Lazy loading pada ORM (library yang membuatkan query DB secara otomatis) menghasilkan query seperti ini tanpa disadari pengembang. Di server development hanya ada beberapa karakter sehingga tidak terasa, dan masalahnya baru muncul saat login bersamaan di server live.

Sumber

  1. Efficient Querying .NET
    Lazy loading pada ORM menimbulkan masalah N+1, yaitu satu query tambahan untuk setiap item, sehingga performa turun drastis; dianjurkan memuat data sekaligus (eager loading)
  2. pg_stat_statements — track statistics of SQL planning and execution PostgreSQL
    Mengumpulkan jumlah eksekusi (calls) dan total waktu eksekusi per statement untuk membuat peringkat query yang paling sering dipanggil
  3. Performance Schema Statement Digests and Sampling MySQL
    events_statements_summary_by_digest mengelompokkan query berpola sama lalu menghitung jumlah dan waktunya
  4. Statement Summary Tables MySQL
    COUNT_STAR (jumlah eksekusi) dan SUM_TIMER_WAIT (total waktu) di tabel ringkasan
  5. Server Status Variables MySQL
    Questions: jumlah statement yang dikirim klien

Lihat juga

Lapisan yang sama: L12 Database

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

Lihat kartu interaktif dengan gambar dan simulasi