4 Punkte von GN⁺ 2024-03-20 | Noch keine Kommentare. | Auf WhatsApp teilen
  • Nachdem in Python 3.13 eine neue Methodik zum Aufbau eines JIT-Compilers (copy-patch) eingeführt wurde, fiel die Entscheidung, diese auf PostgreSQL anzuwenden.
  • Vorgestellt wird ein neuer Ansatz namens pg-copyjit, der die Geschwindigkeit des PostgreSQL-Servers verbessern soll.
  • Der gesamte Code ist experimentell und sollte vor dem Einsatz in einer produktiven Umgebung von Fachleuten geprüft werden.

Anfangs gab es kein JIT, dann kam der LLVM-JIT-Compiler

  • In PostgreSQL wurde JIT-Kompilierung mit LLVM eingeführt, doch LLVM hat einige Eigenschaften, die für JIT-Kompilierung nicht ideal sind.
  • LLVM-Optimierungen sind kostspielig, und ohne sie kann die Kompilierung selbst sinnlos sein.
  • Die Kostenschätzung von PostgreSQL für Abfragen steht nicht in direktem Zusammenhang mit der tatsächlichen Ausführungszeit, weshalb viele Nutzer den JIT-Compiler deaktivieren.

2021 wurde Copy-and-Patch beschrieben

  • Es besteht die Notwendigkeit, möglichst schnell schnellen und ausreichend guten Code zu erzeugen.
  • Der copy-patch-Ansatz erzeugt Code schnell mithilfe von in C geschriebenen Stencils (Template-Funktionen).
  • Die Stencils werden in einen neuen Speicherbereich kopiert, Lücken werden gefüllt, und anschließend kann direkt in die „kompilierte“ Funktion gesprungen werden.

Copy-and-Patch nach PostgreSQL bringen

  • Der Aufbau einer neuen JIT-Engine für PostgreSQL ist nicht besonders schwierig; vorgeschlagen wird, LLVM zu einem Plugin zu machen, damit andere JIT-Compiler eingeführt werden können.
  • Es reicht aus, eine einzelne Funktion _PG_jit_provider_init bereitzustellen und drei Callbacks zu initialisieren: compile_expr, release_context und reset_after_error.
  • Der copy-patch-Algorithmus ist einfach: Für jeden Opcode wird der passende Stencil gesucht und hinzugefügt, anschließend werden die benötigten Werte in die Lücken eingesetzt.

Aktueller Stand

  • Es funktioniert mit PostgreSQL 16 und unterstützt derzeit nur AMD64.
  • Die Codegenerierung ist in wenigen hundert Mikrosekunden abgeschlossen und kann daher auch bei kurzen Abfragen genutzt werden.
  • Zwar gibt es noch keine Optimierungsphase, aber im Vergleich zum Interpreter ist bereits eine bessere Performance zu erkennen.
  • Es sind noch nicht viele Opcodes implementiert; bei Abfragen, die noch nicht unterstützt werden, springt stattdessen der PostgreSQL-Interpreter ein.

Was noch zu tun ist...

  • Dies befindet sich im Proof-of-Concept-Stadium; ein einfacher Build- oder Packaging-Prozess ist derzeit noch kein Thema.
  • Der Fokus liegt darauf, mehr Opcodes zu implementieren und Optimierungsmöglichkeiten zu finden.
  • Auch die Portierung auf andere Architekturen wird ernsthaft in Betracht gezogen.

Danksagung

  • Dank gilt dem aktuellen Arbeitgeber Entr’ouvert, dessen Kolleginnen und Kollegen Zeit für dieses Projekt ermöglicht haben.
  • Ebenfalls bedankt wird sich bei den DBA-Freunden, verbunden mit der Empfehlung, PoWA auszuprobieren.

Meinung von GN⁺

  • Dieser Artikel stellt einen neuen Ansatz zur Verbesserung der Performance des PostgreSQL-Datenbankservers vor. Das könnte für Datenbankadministratoren und Entwickler interessant sein.
  • Bevor experimenteller Code in produktiven Umgebungen eingesetzt wird, sind gründliche Tests und Validierung erforderlich. So lassen sich Risiken wie Datenverlust oder Ausfallzeiten vermeiden.
  • Im Vergleich zu bestehenden JIT-Compilern wie LLVM kann der copy-patch-Ansatz eine schnellere Codegenerierung ermöglichen und dadurch auch für kurze Abfragen nützlich sein.
  • Sollte diese Technik in der PostgreSQL-Community breite Akzeptanz finden, könnte sie zusammen mit der Unterstützung weiterer Architekturen ein neues Kapitel bei der Optimierung der Datenbank-Performance aufschlagen.
  • Kritisch betrachtet steht das Projekt noch am Anfang, und es braucht weitere Forschung und Entwicklung, um zu zeigen, wie sich die tatsächlichen Performancegewinne in produktiven Umgebungen auswirken.

Noch keine Kommentare.

Noch keine Kommentare.