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
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.