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

Game-Lag-Whitepaper › L10 Arbeitsspeicher

Speicherfragmentierung Heap fragmentation

Ursachen-ID mem-fragment · Hauptzuständig Server-Entwicklung (Entwicklungsteam)

In der interaktiven Fassung mit Grafiken und Experimenten öffnen →

Zerfällt freier Speicher durch ständiges Allozieren und Freigeben in kleine Stücke, belegt der Prozess viel mehr Speicher, als er tatsächlich nutzt.

Warum Viele Threads allozieren und geben über lange Zeit Speicherblöcke unterschiedlicher Größe frei → Folge Freier Speicher in kleinen Stücken verstreut, kann nicht ans OS zurückgegeben werden, Verbrauch steigt wie bei einem Leck immer weiter → Auf dem Bildschirm Je länger der Server läuft, desto langsamer wird er durch Swap und Speichermangel, bis er zwangsweise beendet wird

Symptome
Zeitlupe, Verbindungsabbruch
Faktoren
Stillstand
Wer ist betroffen
Ganzer Server
Wann
Je länger es läuft
Zuständigkeit
Hauptzuständig Server-Entwicklung (Entwicklungsteam)
Aufgaben Entwicklungsteam
Speicher-Pools pro Blockgröße und fragmentierungsresistente Allokatoren (jemalloc, mimalloc u. a.) einsetzen.
Im Graphen
Langsamer Anstieg · Prozessspeicher (RSS)
Wo nachsehen
Zwei Server mit demselben Build starten, nur bei einem die Zahl der glibc-Arenen per Umgebungsvariable MALLOC_ARENA_MAX senken oder auf einen anderen Allokator wie jemalloc wechseln, dann einige Tage lang RSS aus pidstat -r vergleichen
Spricht dafür
Bei ähnlicher Spieler- und Objektzahl hört der RSS-Anstieg nur beim geänderten Server auf oder fällt deutlich geringer aus
Spricht dagegen
Steigt nach dem Allokatorwechsel genauso: nie freigegebener Speicher (mem-leak)
Prüfmittel
Mit Infrastruktur-Tools prüfbar (ohne Spielcode)
Mehr dazu
Der Verlauf sieht aus wie bei einem Speicherleck, doch die Heap-Analyse findet keine Leckstelle. Beim Standard-Allokator von Linux (glibc) ist das Problem auf Servern mit vielen Threads besonders ausgeprägt. Schon ein Wechsel des Allokators kann den Verbrauch deutlich senken.

Quellen

  1. mallopt(3) — Linux manual page Linux man-pages
    glibc malloc legt zur Verringerung von Thread-Contention Arenen bis zu einem Vielfachen der CPU-Anzahl an, mehr Arenen bedeuten mehr Speicherverbrauch (Begrenzung mit M_ARENA_MAX, auch per Umgebungsvariable MALLOC_ARENA_MAX einstellbar)
  2. jemalloc memory allocator jemalloc
    Allgemeine malloc-Implementierung mit Schwerpunkt auf Vermeidung von Fragmentierung und skalierbarer Nebenläufigkeit
  3. pidstat(1) — Linux manual page sysstat
    -r: RSS pro Prozess (tatsächlich im RAM liegender Speicher)

Verwandte Ursachen

Gleiche Schicht: L10 Arbeitsspeicher

Ursachen aus anderen Schichten mit demselben Symptom (Zeitlupe)

Karte in der interaktiven Fassung mit Grafiken und Experimenten ansehen