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

Game-Lag-Whitepaper › L12 Datenbank

Erschöpfter Connection-Pool Connection pool exhaustion

Ursachen-ID db-pool · Hauptzuständig Server-Entwicklung (Entwicklungsteam) · Beteiligt DB-Infrastruktur (Infrastrukturteam)

In der interaktiven Fassung mit Grafiken und Experimenten öffnen →

Die Zahl der Verbindungen zur DB ist fest. Belegen langsame Queries die Verbindungen, müssen alle anderen Anfragen warten.

Warum Durch langsame Queries oder eine Flut von Anfragen sind alle Verbindungen belegt → Folge Neue Anfragen warten, bis eine Verbindung frei wird → Auf dem Bildschirm Endlos-Laden beim Login, verzögertes Speichern, Timeouts

Symptome
Kein Login / Endlos-Laden, Input-Lag
Faktoren
Stillstand, Latenz
Wer ist betroffen
Ganzer Server, Nur eine bestimmte Funktion
Wann
Direkt nach Login oder Wartung, Bei großem Andrang
Zuständigkeit
Hauptzuständig Server-Entwicklung (Entwicklungsteam) · Beteiligt DB-Infrastruktur (Infrastrukturteam)
Aufgaben Entwicklungsteam
Langsame Queries beseitigen, Pool-Größe und Warte-Timeout anpassen (Pool nicht pauschal vergrößern), getrennte Pools je Funktion einrichten.
Aufgaben Infrastrukturteam
Maximale Verbindungszahl der DB sowie CPU- und IOPS-Reserven prüfen, vor Skalierung oder Autoscaling prüfen, ob Serveranzahl × Pool-Größe innerhalb der maximalen Verbindungszahl bleibt, Metriken für Verbindungs- und Lock-Wartezeiten ins Monitoring aufnehmen.
Größenordnungen
Die nötige Zahl an Verbindungen lässt sich mit „Anfragen pro Sekunde × Zeit, die eine Anfrage eine Verbindung belegt“ abschätzen. Bei 2.000 Anfragen pro Sekunde und 5 ms pro Anfrage sind im Mittel ständig 10 Verbindungen beschäftigt. Für Lastspitzen plant man üblicherweise das Zwei- bis Dreifache ein. Wird die Query auf 150 ms langsamer, braucht dieselbe Last 300 Verbindungen.
Im Graphen
Plateau am Limit · Belegte DB-Verbindungen, Wartezeit auf Verbindungen
Wo nachsehen
Auf DB-Seite den Verbindungsstatus je Spielserver zählen. MySQL: Host, Command (untätige Verbindungen: Sleep) und Time aus SHOW PROCESSLIST sowie Threads_connected, Threads_running und die Zahl abgewiesener Verbindungen Connection_errors_max_connections prüfen. PostgreSQL: pg_stat_activity nach client_addr und state gruppiert zählen. Liefert die Connection-Pool-Bibliothek des Spielservers Anzahl und Dauer der Wartevorgänge, diese ebenfalls prüfen
Spricht dafür
Alle Verbindungen eines Spielservers (so viele, wie der Pool groß ist) führen Queries aus, keine Verbindung ist frei, währenddessen warten Login und Speichern. Oder die Gesamtzahl der DB-Verbindungen erreicht max_connections, und neue Verbindungen werden abgewiesen
Spricht dagegen
Genug freie Verbindungen, trotzdem langsam: Latenz der Queries selbst (db-no-index, db-hot-row) oder ausgelastete DB-Ressourcen
Prüfmittel
Mit Infrastruktur-Tools prüfbar (ohne Spielcode)
Mehr dazu
Ein pauschal vergrößerter Pool erhöht nur die CPU-Last der DB und die Lock-Contention, und alle werden gemeinsam langsamer. Übersteigt außerdem Serveranzahl × Pool-Größe die maximale Verbindungszahl der DB, bekommen neu hinzugefügte oder neu gestartete Server nicht einmal eine Verbindung. Das passiert häufig direkt nach Autoscaling oder Wartung.

Quellen

  1. Number Of Database Connections PostgreSQL
    Sind die DB-Ressourcen ausgeschöpft, sinkt der Durchsatz durch weitere Verbindungen sogar; aktive Verbindungen an die Ressourcen anzupassen und den Rest in eine Warteschlange zu stellen, verbessert Latenz und Durchsatz
  2. Too many connections MySQL
    Sind alle max_connections belegt, werden neue Verbindungen mit dem Fehler Too many connections abgewiesen
  3. Connections and Authentication (PostgreSQL Documentation) PostgreSQL
    max_connections: Obergrenze gleichzeitiger Verbindungen, Standard meist 100
  4. SHOW PROCESSLIST Statement MySQL
    Host (Client-Adresse), Command (untätige Sessions: Sleep), Time, State
  5. Server Status Variables MySQL
    Threads_connected und Threads_running, Connection_errors_max_connections (wegen Erreichen von max_connections abgewiesene Verbindungen)
  6. The Cumulative Statistics System (PostgreSQL Documentation) PostgreSQL
    pg_stat_activity: client_addr und state (active, idle, idle in transaction usw.) je Verbindung

Verwandte Ursachen

Gleiche Schicht: L12 Datenbank

Ursachen aus anderen Schichten mit demselben Symptom (Kein Login / Endlos-Laden)

Karte in der interaktiven Fassung mit Grafiken und Experimenten ansehen