- Postgres 18, derzeit in Beta 1, führt Unterstützung für asynchrones I/O (Asynchronous I/O) ein und verbessert damit insbesondere die Leseleistung in Cloud-Umgebungen deutlich
- Über den neuen Parameter
io_method kann man neben der klassischen sync-Methode auch worker- und io_uring-Modi auswählen
- Benchmarks auf AWS zeigen: Mit
io_uring lässt sich die Leistung beim Lesen von Datenträgern um bis zu das 3-Fache steigern
- Durch die Asynchronität wird allerdings die Interpretation der I/O-Timings in der bisherigen Query-Analyse (
EXPLAIN ANALYZE) schwieriger
- Für die Leistungsoptimierung sind die neue Monitoring-View
pg_aios sowie Tuning-Parameter wie effective_io_concurrency wichtig
Einführung von asynchronem I/O in Postgres 18
- Traditionell verwendet Postgres ein blockierendes I/O-Modell, bei dem auf den Abschluss jedes Festplatten-Lesevorgangs gewartet wird
- Durch die hohe Latenz netzwerkbasierter Storage-Systeme (wie EBS) entstehen in Cloud-Umgebungen Engpässe
- Asynchrones I/O ermöglicht es, mehrere Lesevorgänge parallel zu verarbeiten, was die CPU-Auslastung und den Gesamtdurchsatz erhöht
Vorarbeit in Postgres 17: Read Stream API
- In Postgres 17 wurde die
read_stream-API eingeführt, um die Abstraktion von Leseoperationen zu standardisieren
- Sie stützt sich jedoch weiterhin auf den OS-Seitencache und spiegelt sich nicht direkt im Shared Buffer von Postgres wider
- In Postgres 18 sind nun direkte asynchrone Lesevorgänge statt bloßer Kernel-Hinweise möglich
Neue Einstellung: io_method
- Postgres 18 ergänzt in
postgresql.conf die Einstellung io_method und bietet dabei drei Optionen:
io_method = sync
- Die bisherige synchrone Methode wie in älteren Postgres-Versionen
- Verwendet ein Verfahren für vorgezogene Leseanforderungen auf Basis von
posix_fadvise()
io_method = worker (Standard)
- Dedizierte I/O-Worker-Prozesse lesen Daten asynchron ein und übergeben sie an den Shared Buffer
- Der Hauptprozess kann ohne Unterbrechung durch Lesevorgänge weiterlaufen
- Standardmäßig sind 3 Worker aktiv; anpassbar über
io_workers
io_method = io_uring
- Hochleistungs-I/O-Schnittstelle, verfügbar ab Linux-Kernel 5.1
- Führt asynchrone Lesevorgänge direkt über einen mit dem Kernel geteilten Ringpuffer aus, ohne Worker-Prozesse
- Erfordert einen aktuellen Kernel, ein passendes Dateisystem und entsprechende Konfiguration
Performance-Benchmarks für asynchrones I/O (AWS-Basis)
- Testumgebung:
- AWS c7i.8xlarge (32 vCPU, 64GB RAM)
- 100GB io2 EBS, 20.000 IOPS
- Ausführung von
SELECT COUNT(*) auf einer Tabelle mit 3,5GB Größe
Vergleich der Cold-Cache-Leistung:
| Version/Einstellung |
Ausführungszeit (ms) |
| Postgres 17 (sync) |
15.831 |
| Postgres 18 (sync) |
15.071 |
| Postgres 18 (worker) |
10.052 |
| Postgres 18 (io_uring) |
5.723 |
io_uring bringt gegenüber sync eine 2,8-fache Leistungssteigerung
- Besonders wirksam, um Festplattenlatenzen in der Cloud zu reduzieren
Tuning von effective_io_concurrency
- In Postgres 18 beeinflusst dieser Parameter die Anzahl interner asynchroner Read-Ahead-Anfragen
- Der Standardwert wurde von 1 auf 16 angehoben; zusammen mit
io_combine_limit bestimmt er den maximalen Lesebereich
- In Cloud-Umgebungen mit hoher Latenz können größere Werte vorteilhaft sein, Benchmarks pro Workload bleiben aber notwendig
Neues Monitoring-Werkzeug: pg_aios
- In
pg_stat_activity erscheinen asynchrone Vorgänge als Event AioIoCompletion, was die Analyse von Wartezuständen im Backend erschwert
- Bei
io_uring gilt zudem: Da der Kernel die Verarbeitung direkt übernimmt, ist der I/O-Status in Postgres nicht sichtbar
- Über die View
pg_aios lassen sich detaillierte Informationen zu aktuell laufenden asynchronen Anfragen einsehen
SELECT * FROM pg_aios;
- Statuswerte wie
SUBMITTED, COMPLETED_IO sowie Informationen zu den Zielblöcken sind dort einsehbar
Achtung: Veränderte Interpretation von I/O-Timing-Informationen
- Die in
EXPLAIN ANALYZE angezeigten I/O Timings sind nur bei synchroner Ausführung zuverlässig
- Bei asynchronen Modi wie
worker und io_uring wird die Interpretation der Timing-Daten durch Parallelisierung und Verteilung auf Worker verzerrt
- Um den tatsächlichen I/O-Aufwand zu bewerten, empfiehlt sich die Nutzung der Anzahl von
shared read-Buffern und pg_aios
Fazit
- Postgres 18 leistet einen spürbaren Beitrag zur Performance bei leseintensiven Workloads
- Besonders bei Festplatten mit hoher Latenz in Cloud-Umgebungen sind deutliche Vorteile zu erwarten
- Gleichzeitig ist ein Umdenken bei der Interpretation von Metriken, beim Performance-Tuning und bei der Anwendung der Konfiguration erforderlich
- Für Postgres 19 wird zudem Unterstützung für asynchrone Schreibvorgänge erwartet
2 Kommentare
Postgres ist wirklich einfach das Allerbeste.
Hacker-News-Kommentare
preadv2(..., RWF_NOWAIT)asynchrone Lesevorgänge aus dem Page Cache durchführen. Das könnte nützlich sein, um die Latenz beiio_method = workerzu verringern.NOWAITzu lesen und nur bei einem Fehlschlag an einen Worker-Thread auszulagern.aio(4)gesteckt, und da es die Nachteile von Linux/glibcaionicht hat, dürfte seine Funktionsweise interessant sein.io_uring, und es wird gefragt, ob viele Linux-Administratoren oder Distributionen es deshalb deaktivieren.VACUUM ANALYZE-Jobs mitpgcron.pgbouncerdann nicht mehr verwenden zu müssen.