cc-slurm-adapter
ClusterCockpit benötigt eine Komponente, die laufende und abgeschlossene Slurm-Jobs zuverlässig an cc-backend überträgt. Für Installationen mit Slurm ≥ 24.05 ist cc-slurm-adapter die empfohlene Lösung. Läuft eine ältere Slurm-Version, muss cc-slurm-sync (siehe Kapitel) eingesetzt werden.
Übersicht
Der Adapter stammt aus dem ClusterCockpit-Ökosystem und synchronisiert Jobdaten fortlaufend zu cc-backend. Er läuft auf demselben Knoten wie slurmctld und arbeitet ausschließlich mit Slurm-Werkzeugen (sacct, squeue, sacctmgr, scontrol). slurmrestd wird nicht benötigt, slurmdbd hingegen zwingend. Standardmäßig stößt ein periodischer Timer (1 Minute) die Synchronisierung zwischen Slurm und cc-backend an. Neustarts von Backend, Slurm oder dem Adapter selbst sollen keine Jobs verlieren; sobald die Gegenstelle wieder verfügbar ist, werden aufgelaufene Jobs übertragen. Optional kann ein Slurm Prolog/Epilog den Adapter sofort triggern, um Verzögerungen zu verringern.
Einschränkungen
Slurmdbd speichert nicht alle Jobinformationen dauerhaft. Besonders Ressourcendaten, die über scontrol show job --json eingesammelt werden, verschwinden wenige Minuten nach Jobende (gesetzt über den Parameter MinJobAge in der slurm.conf, Default ist 300 Sekunden). Läuft der Daemon längere Zeit nicht, fehlen diese Informationen. cc-backend kann den Job dann zwar listen, aber keine Metriken zuordnen. Daher sollte cc-slurm-adapter nicht längere Zeit gestoppt sein, wenn historische Ressourcenzuordnungen relevant sind.
Kommandozeilen-Aufruf
| Option | Beschreibung |
|---|---|
-config <pfad> | Pfad zur Konfigurationsdatei |
-daemon | Startet den Adapter als Daemon |
-debug <log-level> | Setzt das Log-Level (Standard 2) |
-help | Listet alle Flags |
Ohne -daemon läuft der Adapter im Prolog/Epilog-Modus und erwartet, im Kontext eines Slurm-Hooks gestartet zu werden.
Konfiguration
Beispiel
Viele Werte sind optional. Nicht gesetzte Felder verwenden Defaults (siehe Referenz).
{
"pidFilePath": "/run/cc-slurm-adapter/daemon.pid",
"prepSockListenPath": "/run/cc-slurm-adapter/daemon.sock",
"prepSockConnectPath": "/run/cc-slurm-adapter/daemon.sock",
"lastRunPath": "/var/lib/cc-slurm-adapter/last_run",
"slurmPollInterval": 60,
"slurmQueryDelay": 1,
"slurmQueryMaxSpan": 604800,
"slurmQueryMaxRetries": 5,
"ccRestUrl": "https://my-cc-backend-instance.example",
"ccRestJwt": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"gpuPciAddrs": {
"^nodehostname0[0-9]$": [
"00000000:00:10.0",
"00000000:00:3F.0"
]
},
"ignoreHosts": "^nodehostname9\\w+$"
}
Für ein Testsystem genügt es oft, zunächst nur ccRestUrl, ccRestJwt und einen passenden gpuPciAddrs-Block anzupassen.
Referenz
| Schlüssel | Optional | Beschreibung |
|---|---|---|
pidFilePath | ja | Speicherort der PID-Datei zur Vermeidung paralleler Startversuche. |
prepSockListenPath | ja | PrEp-Socket des Daemons (Unix- oder TCP-Socket, z. B. tcp:127.0.0.1:12345). |
prepSockConnectPath | ja | PrEp-Socket im Prolog/Epilog-Modus, gleiches Format wie oben. |
lastRunPath | ja | Datei, deren Timestamp den Zeitpunkt der letzten erfolgreichen Synchronisation enthält. |
slurmPollInterval | ja | Sekunden zwischen zwei Synchronisationsläufen ohne Hook-Ereignis. |
slurmQueryDelay | ja | Verzögerung (Sekunden) zwischen Hook-Aufruf und Abfrage, um Slurm Zeit zu geben. |
slurmQueryMaxSpan | ja | Maximale Zeitspanne (Sekunden) rückwirkender Synchronisation, um Massenimporte zu verhindern. |
slurmMaxRetries | ja | Anzahl schneller Slurm-Abfrageversuche nach einem Hook-Ereignis. |
ccRestUrl | nein | Basis-URL der cc-backend REST-API (ohne Slash am Ende). |
ccRestJwt | nein | JWT vom cc-backend zur Authentifizierung. |
gpuPciAddrs | ja | Mapping von Hostname-Regex zu sortierten PCI-Adressen der GPUs für NVML-Zuordnung. |
ignoreHosts | ja | Regex von Hostnamen, die ignoriert werden sollen. Passt sie auf alle Hosts eines Jobs, wird der Job verworfen. |
Admin-Anleitung
Kompilieren
make
Daemon
Binärdatei und Konfiguration verteilen
Binary und Konfigurationsdatei können beliebig platziert werden. Da die Konfiguration sensible Daten (cc-backend JWT) enthält, sollten die Rechte restriktiv gesetzt sein.
systemd-Service installieren
[Unit]
Description=cc-slurm-adapter
Wants=network.target
After=network.target
[Service]
User=cc-slurm-adapter
Group=slurm
ExecStart=/opt/cc-slurm-adapter/cc-slurm-adapter -daemon -config /opt/cc-slurm-adapter/config.json
WorkingDirectory=/opt/cc-slurm-adapter/
RuntimeDirectory=cc-slurm-adapter
RuntimeDirectoryMode=0750
Restart=on-failure
RestartSec=15s
[Install]
WantedBy=multi-user.target
Der Service läuft als Benutzer cc-slurm-adapter, das RuntimeDirectory /run/cc-slurm-adapter wird für PID-Datei und PrEp-Socket angelegt. Die Gruppe slurm erhält Zugriff, damit Prolog/Epilog-Hooks (laufen als Slurm-Benutzer) auf den Socket zugreifen können.
Slurm-Berechtigungen setzen
Je nach Slurm-Konfiguration dürfen nur privilegierte Benutzer sacct oder scontrol nutzen. Damit cc-slurm-adapter als eigener Benutzer laufen kann, muss er Zugriff erhalten, z. B.:
sacctmgr add user cc-slurm-adapter Account=root AdminLevel=operator
Fehlende Rechte führen dazu, dass keine Jobs gemeldet werden.
Debugging
Der Daemon schreibt Logs auf stderr. Mit -log-level 5 lässt sich die ausführliche Ausgabe aktivieren, um Probleme schneller zu erkennen. Die Standardausgabe (Level 2) versucht bereits, alle relevanten Warnungen zu enthalten.
Slurmctld Prolog/Epilog Hook (optional)
Zur Reduktion der Latenz kann cc-slurm-adapter über einen Slurmctld-Hook unmittelbar angestoßen werden. Ergänzung in slurm.conf:
PrEpPlugins=prep/script
PrologSlurmctld=/some_path/hook.sh
EpilogSlurmctld=/some_path/hook.sh
Beispielskript:
#!/bin/sh
/opt/cc-slurm-adapter/cc-slurm-adapter
exit 0
Sofern der Standard-PrEp-Socket /run/cc-slurm-adapter/daemon.sock verwendet wird, muss im Hook keine Konfiguration angegeben werden. Bei abweichenden Pfaden -config /pfad/zur/config.json ergänzen und sicherstellen, dass slurm Zugriff hat. Das Skript sollte immer mit Exit-Code 0 enden, damit Slurm-Jobstarts nicht blockiert werden, falls der Adapter temporär nicht erreichbar ist.