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

Game-Lag-Whitepaper › L7 Server-OS (Kernel)

Dateideskriptor-Limit File descriptor limit (ulimit)

Ursachen-ID so-fd · Hauptzuständig Server-Infrastruktur (Infrastrukturteam) · Beteiligt Server-Entwicklung (Entwicklungsteam)

In der interaktiven Fassung mit Grafiken und Experimenten öffnen →

Jede Verbindung braucht einen Dateideskriptor (fd, die Nummer, die das OS einer geöffneten Datei oder einem Socket zuweist). Wie viele fd ein Prozess öffnen darf, ist begrenzt.

Warum Zahl gleichzeitiger Verbindungen erreicht das Dateideskriptor-Limit des Prozesses → Folge Server nimmt keine neuen Verbindungen mehr an (Too many open files). Auch das Öffnen von Logs und DB-Verbindungen schlägt fehl → Auf dem Bildschirm Ab einer exakten Spielerzahl kommt niemand mehr hinein: kein Login oder Endlos-Laden

Symptome
Kein Login / Endlos-Laden
Faktoren
Paketverlust
Wer ist betroffen
Ganzer Server
Wann
Direkt nach Login oder Wartung, Bei großem Andrang
Zuständigkeit
Hauptzuständig Server-Infrastruktur (Infrastrukturteam) · Beteiligt Server-Entwicklung (Entwicklungsteam)
Aufgaben Entwicklungsteam
Sockets beim Beenden einer Verbindung zuverlässig schließen (fd-Leck vermeiden), wenn accept mit EMFILE (keine fd frei) scheitert, kurz keine Verbindungen mehr annehmen oder sie mit einem vorab reservierten fd annehmen und sofort schließen (damit nicht dieselbe Verbindungsmeldung immer wieder verarbeitet und CPU verschwendet wird).
Aufgaben Infrastrukturteam
ulimit und Dienstkonfiguration (LimitNOFILE in systemd) prüfen, Alarm bei Annäherung an das Limit.
Größenordnungen
Ohne eigene Dienstkonfiguration liegt das Limit unter Linux noch oft bei 1024. Spielserver setzen es meist auf Zehntausende bis Hunderttausende hoch. Windows hat kein so niedriges Standardlimit.
Im Graphen
Plateau am Limit · Offene fd des Prozesses, gleichzeitige Verbindungen
Wo nachsehen
Mit pidstat -v fd-nr (Zahl offener Dateideskriptoren) des Spielserver-Prozesses und in /proc/PID/limits das Limit für offene Dateien prüfen, im Serverlog nach accept-Fehlern suchen (EMFILE, Too many open files)
Spricht dafür
Zahl der fd bildet am Limit ein Plateau, ab diesem Zeitpunkt scheitert accept mit EMFILE
Spricht dagegen
fd-Zahl weit unter dem Limit: diese Ursache scheidet aus. Verbindungsanfragen werden schon im Kernel verworfen: „Überlauf der Verbindungswarteschlange (Backlog)“. Problem beim Connection Tracking: „Volle conntrack-Tabelle auf dem Server“
Prüfmittel
Mit Infrastruktur-Tools prüfbar (ohne Spielcode)
Mehr dazu
Nicht angenommene Verbindungen bleiben in der Verbindungswarteschlange (Backlog) des Kernels liegen. Je nach Servercode erhält der Server deshalb ständig die Meldung „neue Verbindung wartet“ und verschwendet CPU-Zeit.

Quellen

  1. systemd-system.conf(5) — Linux manual page systemd
    Standardwert von DefaultLimitNOFILE für Dienste ist 1024:524288 (Soft-Limit 1024)
  2. accept(2) — Linux manual page Linux man-pages
    Erreicht ein Prozess sein fd-Limit, scheitert accept mit EMFILE
  3. Maximum Number of Sockets Supported Microsoft
    Winsock unter Windows begrenzt die Zahl der Sockets nur durch den verfügbaren Speicher
  4. pidstat(1) — Linux manual page sysstat
    fd-nr bei -v: Zahl der vom Prozess geöffneten Dateideskriptoren
  5. proc_pid_limits(5) — Linux manual page Linux man-pages
    /proc/PID/limits enthält Soft- und Hard-Werte der Ressourcenlimits pro Prozess

Verwandte Ursachen

Gleiche Schicht: L7 Server-OS (Kernel)

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

Karte in der interaktiven Fassung mit Grafiken und Experimenten ansehen