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

Game-Lag-Whitepaper › L10 Arbeitsspeicher

Swap Swapping

Ursachen-ID mem-swap · Hauptzuständig Server-Infrastruktur (Infrastrukturteam) · Beteiligt Server-Entwicklung (Entwicklungsteam)

In der interaktiven Fassung mit Grafiken und Experimenten öffnen →

Wird der Arbeitsspeicher knapp und lagert das OS einen Teil auf den Datenträger aus, wartet jeder Zugriff auf diesen Speicher auf einen über 1.000-mal langsameren Datenträger.

Warum Belegter Speicher übersteigt den physischen RAM → Folge OS lagert einen Teil auf den Datenträger aus und liest ihn bei Bedarf zurück → Auf dem Bildschirm Ticks schnellen auf mehrere hundert ms hoch, alle Spieler auf dem Server erleben Zeitlupe und Freezes

Symptome
Zeitlupe, Freeze
Faktoren
Stillstand
Wer ist betroffen
Ganzer Server
Wann
Je länger es läuft, Abendliche Stoßzeit
Zuständigkeit
Hauptzuständig Server-Infrastruktur (Infrastrukturteam) · Beteiligt Server-Entwicklung (Entwicklungsteam)
Aufgaben Entwicklungsteam
Speicherverbrauch des Prozesses begrenzen (Heap-Größe u. a.), auf Lecks prüfen.
Aufgaben Infrastrukturteam
Spielserver so konfigurieren, dass sie keinen Swap nutzen, auf Speicheralarme reagieren, RAM großzügig über dem Spitzenverbrauch einplanen, denn ohne Swap wird der Prozess beendet (OOM), sobald der Speicher ausgeht.
Größenordnungen
Ein RAM-Zugriff dauert etwa 100 ns, das Zurücklesen von einer SSD etwa 100 µs (1.000-mal so lange), von einem über das Netzwerk angebundenen Cloud-Datenträger etwa 1 ms (10.000-mal) und von einer HDD 10 ms (100.000-mal).
Im Graphen
Langsamer Anstieg · Swap-Belegung, Swap-in/-out
Wo nachsehen
Spalten si und so von vmstat 1 (pro Sekunde aus dem Swap eingelesene bzw. ausgelagerte Menge), some und full in /proc/pressure/memory (Zeitanteil, in dem auf Speicher gewartet wurde) und majflt/s aus pidstat -r für den Spielserverprozess (Page Faults, die vom Datenträger nachladen mussten) über die Tick-Zeit legen
Spricht dafür
Zum Zeitpunkt des Lags ist si größer als 0, majflt/s des Spielservers und der full-Wert von memory steigen gemeinsam
Spricht dagegen
si und so bei 0, Speicherdruck (PSI) nahe 0: Swap scheidet aus. Kein Swap, aber majflt/s und PSI steigen: Speicher fast erschöpft, Code-Seiten werden neu eingelesen, zuerst Speicher freimachen
Prüfmittel
Mit Infrastruktur-Tools prüfbar (ohne Spielcode)
Mehr dazu
Ein Server mit GC liest beim Sammeln den ganzen Heap kreuz und quer. Ist auch nur ein Teil des Heaps ausgelagert, kann eine einzelne GC einige bis einige Dutzend Sekunden dauern. Ohne Swap entfällt die Phase, in der das Auslagern bremst, und der Prozess wird direkt beendet (OOM). Deshalb muss zuerst genug freier Speicher eingeplant werden. Auch ohne Swap kann der ganze Server vor dem erzwungenen Beenden eine Weile stark langsamer werden: Ist der Speicher fast erschöpft, entfernt das OS sogar die Code-Seiten der ausführbaren Datei aus dem Speicher und liest sie erneut ein.

Quellen

  1. Designs, Lessons and Advice from Building Large Distributed Systems (LADIS 2009 keynote) Google
    „Numbers Everyone Should Know“: Hauptspeicherzugriff 100 ns, Disk-Seek 10 ms (Stand 2009)
  2. Documentation for /proc/sys/vm/ Linux kernel
    swappiness: relative Kosten von Swapping und dem Freigeben von Dateiseiten, Swap ist Random-I/O und daher teuer
  3. Concepts overview Linux kernel
    Der Kernel gibt Page Cache mit Original auf dem Datenträger und auslagerbare Seiten frei, reicht das nicht, beendet der OOM-Killer einen Prozess
  4. Solidigm™ D7-P5520 and D7-P5620 Product Brief Solidigm
    Latenz im 99,99. Perzentil (Four-Nines Latency) von Server-NVMe-SSDs 130 µs: Beleg dafür, dass ein einzelner SSD-Lesezugriff um die 100 µs dauert
  5. Amazon EBS General Purpose SSD volumes AWS
    Latenz des Standard-Cloud-Datenträgers (gp3) im einstelligen Millisekundenbereich
  6. vmstat(8) — Linux manual page procps-ng
    si: pro Sekunde aus dem Swap eingelesener Speicher, so: pro Sekunde in den Swap ausgelagerter Speicher
  7. PSI - Pressure Stall Information Linux kernel
    some (Zeitanteil, in dem einige Tasks blockiert waren) und full (Zeitanteil, in dem alle Tasks gleichzeitig blockiert waren) in /proc/pressure/memory
  8. pidstat(1) — Linux manual page sysstat
    -r: majflt/s (Faults, bei denen eine Seite vom Datenträger gelesen werden musste)

Verwandte Ursachen

Gleiche Schicht: L10 Arbeitsspeicher

Ursachen aus anderen Schichten mit demselben Symptom (Zeitlupe)

Karte in der interaktiven Fassung mit Grafiken und Experimenten ansehen