6 Punkte von GN⁺ 2025-03-15 | 2 Kommentare | Auf WhatsApp teilen
  • Eine Single-Process-Sandbox auf KVM-Basis
    • Kann gewöhnliche Linux-Programme oder Programme ausführen, die eine bestimmte API verwenden, innerhalb der Sandbox
  • Bietet mithilfe von Hardware-Virtualisierung native Performance
  • Verwendet nur einen Teil der KVM-API → dadurch ist die Codebasis klein und effizient

Design von TinyKVM

  • Unterstützt die Ausführung statischer Linux-ELF-Programme
    • Unterstützung für dynamische Executables soll später ergänzt werden
    • Kann auch zu einer API erweitert werden, um Zugriff auf externe HTTP-Server oder Caches bereitzustellen
    • Läuft derzeit auf AMD64 (x86_64), eine Portierung auf AArch64 (64-Bit-ARM) ist geplant
  • Hugepage-Unterstützung
    • Kann Hugepages für Gastseiten erzeugen
    • Hugepages können auch auf dem Host verwendet werden → verbessert die Performance
    • Beispiel: Bei der Zuweisung von 2MB-Seiten wurde eine um 5 % bessere LLVM-Kompilierungsleistung bestätigt
  • Schnelle Funktionsaufrufe
    • Der Overhead bei Funktionsaufrufen aus dem Gast beträgt 2μs
    • Ohne Timer sinkt der Overhead auf 1,2μs
  • Unterstützt Remote-Debugging
    • Remote-Debugging mit GDB ist möglich
    • Nach dem Debugging kann das Programm normal fortgesetzt werden
  • Copy-on-Write-Unterstützung
    • Unterstützt eine eigene Fork-Funktion → minimiert das Kopieren von Speicher
    • Beispiel: Beim Duplizieren eines 6GB-Modells werden nur 260MB Speicher pro Instanz benötigt
  • Schnelle Initialisierung des Zustands
    • Der Gastzustand kann schnell zurückgesetzt werden → erhöht die Sicherheit
    • Ein Reset pro Request verringert das Risiko, dass Zustände offengelegt werden
  • Vereinfachte Codebasis
    • Nutzt etwa 42k LOC der KVM-API
    • Die TinyKVM-Codebasis selbst umfasst etwa 9k LOC → deutlich kleiner als konkurrierende Lösungen
    • Beispiel: Wasmtime 350k LOC, FireCracker 165k LOC
  • Statische Erstellung von Seitentabellen
    • Seitentabellen können zur Laufzeit nicht verändert werden → erhöht die Sicherheit
    • Führt Integritätsprüfungen der Seitentabellen durch
  • Getrennter Prozesskontext
    • KVM-Gäste verwenden separate PCID/ASID → widerstandsfähiger gegen spekulative Ausführungsangriffe wie Spectre
  • Sicherheitsgehärteter Kernel
    • SMEP und SMAP sind aktiviert
    • CPU-Ausnahmen können im User-Mode behandelt werden

Behandlung von System Calls

  • API-Verbindung zum Host
    • System Calls werden über SYSCALL/SYSRET oder die OUT-Instruktion ausgeführt
    • Beim Ausführen eines System Calls tritt ein VM-Exit auf → dauert etwa 1μs
    • Empfohlen wird ein API-Design mit wenigen kleinen Aufrufen und größeren I/O-Einheiten

Benchmarks

  • Overhead bei VM-Aufrufen
    • Gemessen wurde die Tail Latency beim Reset der VM
    • Bei einfachen Aufrufen ohne Reset ist der Overhead gering
  • Speicher-Performance
    • Die Speicherleistung liegt im normalen Bereich
    • Beispiel: Im HTTP-Benchmark sind 1500 AVIF-Kodierungen pro Sekunde möglich
  • JPEG → AVIF-Konvertierungsleistung
    • Etwa 1582 Bilder pro Sekunde können konvertiert werden
    • Verlustfreie Konvertierung ist über den YUV-Konvertierungspfad möglich

Warum die Sandbox so schnell ist

  • Kein I/O und keine Treiber
    • Kein I/O, keine Treiber, keine virtuellen Geräte → verhindert Performance-Verluste
    • Verwendet nur CPU-Ressourcen → kommt nativer Geschwindigkeit sehr nahe
  • Hugepage-Optimierung
    • Hugepages reduzieren Page Walks → verbessert die Performance
    • Erreicht bei großen LLM-Workloads 99,7 % der nativen Performance
  • Schnelle VM-Aufrufe
    • Minimaler Overhead bei Funktionsaufrufen aus dem Gast
    • Datenverarbeitung mit nativer CPU-Geschwindigkeit möglich

Einschränkungen

  • Anzahl der vCPUs kann nicht reduziert werden
    • Über die KVM-API kann die Anzahl der vCPUs nicht verringert werden
    • Multiprocessing lässt sich stattdessen durch parallele Ausführung mehrerer VMs lösen
  • Problem mit sinkender Reset-Performance
    • Beim Zurücksetzen des VM-Zustands kann es zu Performance-Einbußen kommen
    • Das lässt sich jedoch durch geteilten Zustand und Duplizierung lösen

Nächste Aufgaben

  • Unterstützung für Intel TDX und AMD SEV hinzufügen
  • Portierung auf AArch64
  • Funktion zum Sperren von Speicher (KVM_MEM_READONLY) hinzufügen → erhöht die Sicherheit
  • Benutzerfreundlichere API verbessern
  • Unterstützung für dynamisches Laden von Links ergänzen → stärkere Integration mit Varnish

Fazit

  • TinyKVM ist eine der kleinsten und schnellsten Sandbox-Lösungen
  • Erreicht sowohl mehr Sicherheit als auch Performance-Optimierung
  • Die kleine Codebasis erleichtert die Wartung
  • Wird als Open-Source-Bibliothek bereitgestellt → bei Interesse kann das Code-Repository angesehen werden

TinyKVM-Repository

2 Kommentare

 
xcutz 2025-03-16

Interessant.

 
GN⁺ 2025-03-15
Hacker-News-Kommentare
  • Ich mag das wirklich sehr. Hoffentlich macht ihr einfach weiter mit dem, woran ihr gerade arbeitet

    • Ich wusste, dass du ein Hauptmitwirkender von IncludeOS warst. Dieses Projekt war das Erste, woran ich beim Lesen dieses Blogposts denken musste
    • Ich bin seit Langem besessen von Netzwerkfunktionsvirtualisierung. Das ist die natürlichste Grenze, um Arbeitseinheiten in verteilten Systemen zu trennen, und bietet eine saubere Abstraktion sowie einen effizienten Skalierungsmechanismus
    • Ich nutze Varnish in der Produktion mit sehr großer Zufriedenheit. In mancher Hinsicht ist es sogar vertrauenswürdiger als nginx. Normalerweise vergesse ich sogar, dass es existiert. Seit der richtigen Konfiguration war es nie die Ursache eines Bugs
  • Ähnlich wie Firecracker, aber viel schneller

    • Was mir am besten gefällt, ist die Möglichkeit, den Zustand einer VM sofort auf einen vordefinierten Zustand zurückzusetzen. Das ist so, als würde man eine VM neu starten, ohne sie tatsächlich neu zu starten
    • Das scheint ideal für Netzwerkdienste zu sein, die ständig angegriffen werden. Selbst wenn ein Angriff erfolgreich ist, wird das Ergebnis bei der nächsten Anfrage gelöscht
    • Auch das einfache Teilen von COW-Seiten für Programme, die nicht mit diesem Gedanken im Hinterkopf geschrieben wurden, wie etwa ML-Modell-Runner, ist ziemlich gut
  • Ursprünglicher Beitrag: Link

    • Man findet viele Beiträge zu diesem Thema
  • Wirklich interessant. Die Snapshot-Wiederherstellungsleistung von 2,5us ist vergleichbar mit Wasmtime, hat aber den großen Vorteil, nativen Code ausführen zu können. Allerdings ist die Interoperabilität deutlich langsamer, wenn auch immer noch im Mikrosekundenbereich

    • Im Repository tinykvm_examples gibt es bereits eine QuickJS-Demo, aber es wäre deutlich schneller, wenn man prüfen würde, ob sich eine JavaScript-Laufzeit mit JIT ausführen lässt
    • In Experimenten mit serverseitigem Rendering einer React-App lag natives QuickJS bei etwa 12–20ms, v8 nach dem JIT-Warm-up bei 2–4ms
    • Ich muss das noch genauer untersuchen, aber ich würde gern eine einzelne ausführbare Datei wie Deno erstellen, die in der Sandbox läuft und alle HTTP-Anfragen über Varnish verarbeitet
    • Sie würde die angegebene JS-URL abrufen, dann einen Snapshot erstellen und jede Anfrage in einem isolierten Snapshot ausführen lassen
    • Man bräuchte einen Mechanismus, um den Zufalls-Seed pro Anfrage zurückzusetzen
  • Ist das im Grunde nicht so etwas wie libkrun? Link

  • Das ist wohl nicht genau der vorgesehene Einsatzzweck, aber hat jemand Erfahrung damit, einen X-Server (oder Wayland) darauf auszuführen?

    • Ich entwickle auf einem Mac an einem RDP-Server und brauche gelegentlich auch andere Dinge für Clients. Derzeit nutze ich UTM (QEMU-Mac-Frontend) und eine DietPi-VM (stark abgespecktes Debian)
    • Ich kenne mich mit Docker aus und weiß grob, welche Schritte nötig sind, um einen Grafikserver zu betreiben. Ich frage mich, ob es dafür einen einfacheren Weg gibt
  • Interessant, aber ich habe Schwierigkeiten, das große Ganze zu verstehen. Führt man Benutzerprozesse in einer VM ohne Kernel aus? Führt jeder Systemaufruf zum Beenden der VM und wird dann an den Host weitergereicht? Oder gibt es keine Systemaufrufe?

  • Wenn es zum Anwendungsfall passt, ist das wirklich großartig

    • Ein paar Notizen aus dem Beitrag
    • Es wurde festgestellt, dass TinyKVM mit 99,7 % nativer Geschwindigkeit läuft
    • Wenn weder Datei- noch Netzwerkzugriff nötig sind und alles statisch ist, kann es einfach direkt ausgeführt werden
    • TinyKVM-Gäste haben einen kleinen Kernel, der nicht verändert werden kann
  • Wirklich cool

    • Ich untersuche gerade Micro-VMs für ein selbst gehostetes PaaS, und etwas mit so wenig Overhead wirkt wie eine wirklich interessante Option
  • Im Artikel steht nicht, dass es auf Varnish läuft, und tatsächlich sagt der Autor, dass es nicht dafür gedacht ist, Varnish auszuführen