🐳 AI/Daten-Workload essentielle Einstellung: Docker Shared Memory (shm_size und ipc) Vollständig Verstehen



Wenn Sie in AI- und Big-Data-Processing-Workloads Fehler wie OSError: No space left on device erlebt haben, liegt dies meist daran, dass die Konfiguration des Shared Memory (shm_size) des Docker-Containers unzureichend ist.

Dieser Beitrag erläutert klar, warum Shared Memory in der Container-Umgebung wichtig ist und wie man shm_size und die Option ipc: host korrekt konfiguriert.


1. Die Rolle und Bedeutung von shm_size

Rolle: Bestimmung der Shared Memory-Größe des Containers

shm_size ist eine Option, um die maximale Größe des /dev/shm (POSIX Shared Memory) Dateisystems im Container festzulegen.

  • Der Standardwert von Docker beträgt 64MB, was sehr gering ist.

  • Hinweis: /dev/shm verwendet den RAM des Hosts als tmpfs (temporäres Dateisystem) und hat keinen Bezug zu VRAM (GPU-Speicher).

Warum ist es wichtig?

AI/Datenverarbeitungsprozesse nutzen stark Shared Memory, wenn sie große Datenmengen zwischen Prozessen austauschen.

  • PyTorch DataLoader: Wenn num_workers > 0 eingestellt ist, werden Tensoren/Batches über Shared Memory zwischen Worker-Prozessen übertragen. Wenn dieser Speicher nicht ausreicht, tritt der Fehler OSError: No space left on device auf.

  • TensorRT-Engine-Bau/Bereitstellung: Hier wird viel Shared Memory für große Zwischenartefakte oder IPC-Puffer verwendet, was zu einem Scheitern des Engine-Baus oder zu Segmentfehlern führen kann, wenn es nicht ausreicht.

  • Multiprocessing und IPC-Kommunikation: Ist entscheidend für das Teilen großer Arrays/Puffer zwischen Prozessen in NCCL, OpenCV, NumPy usw.


2. ipc-Einstellungen: Der Isolationsbereich des Shared Memory



IPC (Inter-Process Communication) namespace ist eine Docker-Option, die festlegt, in welchem Bereich der Kommunikationsraum (Shared Memory, Semaphore usw.) zwischen den Prozessen im Container isoliert wird.

ipc-Einstellung Funktionsweise Bestimmung der Größe von /dev/shm
Standard (weggelassen) Verwendung des eigenen IPC-Namensraums des Containers (Isolierung) Von shm_size angegebene Größe (Standardwert 64MB)
ipc: host Der Container teilt den IPC-Namensraum des Hosts Größe von /dev/shm des Hosts (normalerweise die Hälfte des RAMs)
ipc: container:<ID> Teilt den IPC mit einem anderen angegebenen Container entsprechend den Einstellungen des geteilten Containers

3. Funktionsweise bei gleichzeitiger Verwendung von shm_size und ipc: host (Beispielanalyse)

In der Regel werden bei AI/LLM-Aufgaben oft shm_size: "16g" und ipc: host gemeinsam eingestellt. Lassen Sie uns anhand eines praktischen Beispiels untersuchen, welche Einstellungen dann angewendet werden.

Beispiel: Einstellungen und Ergebnisanalyse

Snippet der Docker Compose-Einstellungen Ergebnis der Prüfung von df -h /dev/shm im Container
shm_size: "16g"
ipc: host
Dateisystem tmpfs Größe 60G
Verwendet 8.3M
Verfügbar 60G
Verwendungs% 1%
Gemountet auf /dev/shm

Fazit: ipc: host ignoriert shm_size.

  1. Wenn ipc: host aktiv ist: verwendete der Container den IPC-Namensraum des Hosts.

  2. shm_size: "16g" wird ignoriert: Diese Option ist nur relevant, wenn der eigene IPC-Namensraum verwendet wird.

  3. Quelle der 60G: Hosts mit Linux-Systemen sind oft so konfiguriert, dass /dev/shm auf ungefähr die Hälfte des gesamten RAMs gesetzt wird. Daher sieht der Container in diesem Beispiel 60G von den halben 120G des Hosts.

Kernzusammenfassung

Die Einstellung ipc: host bedeutet, dass der Container den Shared Memory-Raum des Hosts nutzt, sodass die Einstellung shm_size tatsächlich nicht angewendet wird.


4. Empfohlene Betriebspraktiken und Speicherbegrenzung

💡 Praktische empfohlene Optionen

  1. ✅ Stabilität zuerst (Empfohlen): ipc: host beibehalten

    • Einstellung: ipc: host beibehalten (oder zusammen mit shm_size verwenden)

    • Ergebnis: Verwendung von großzügigem /dev/shm des Hosts (z.B.: 60G).

    • Vorteil: Vermeidung von Shared Memory-Fehlern in den meisten AI/Datenarbeiten und ist am stabilsten. 60G ist lediglich der Maximalwert, tatsächlich wird nur der verwendete Speicher RAM beansprucht, daher ist es am bequemsten, es so zu belassen, solange kein Speicherdruck besteht.

  2. ✅ Begrenzung für Container erzwingen: ipc: host entfernen

    • Einstellung: ipc: host entfernen + shm_size: "8g" oder "16g" festlegen

    • Ergebnis: Es wird ein 16GB /dev/shm für den Container erstellt.

    • Vorteil: Wenn mehrere Container laufen, lässt sich die Speicherobergrenze für die Shared Memory-Nutzung jedes Containers klar begrenzen, was den Schutz des RAMs des Hosts und die Isolierung verbessert.

⚙️ So ändern Sie die Größe von /dev/shm des Hosts (während Option 1 verwendet wird)

Wenn Sie ipc: host verwenden und die Größe von /dev/shm des Hosts selbst ändern möchten, müssen Sie die tmpfs-Einstellungen ändern.

  • Temporäre Größenänderung (wird beim Neustart zurückgesetzt):
sudo mount -o remount,size=16G /dev/shm
(wird sofort auf alle Prozesse/Container angewendet.)
  • Permanente Größenänderung (Änderung von /etc/fstab):
# Fügen Sie die folgende Zeile zu /etc/fstab hinzu/ändern
tmpfs /dev/shm tmpfs defaults,size=16G 0 0
Nach dem Speichern neu starten oder den oben genannten `remount`-Befehl sofort anwenden.

Wann sollte man es erhöhen? Wenn viele DataLoader-Worker aktiv sind oder beim Bau von TensorRT-Engines gelegentlich No space left on device Fehler auftreten, muss shm_size oder die Größe des Hosts /dev/shm mindestens auf 8G oder mehr eingestellt werden.