Go-Benchmarks: SQL und RESP

Übersicht · Node.js · Go und RESP

Go 1.27.1 mit pgx 5.11.0 und einem RESP2-Client aus der Standardbibliothek; GOMAXPROCS=8. Rechner und Messmethode.

Gemessen am 15. September 2026 mit dem Erweiterungs-Build f03ed22. Der Go-Client läuft innerhalb der Linux-VM in einem separaten Container, der den Netzwerk-Namespace von PostgreSQL teilt. Client-CPU und -Speicher sind aus den Server-Ressourcenzählern ausgeschlossen. RESP verwendet acht Worker, ein Cache-/Buffer-Budget von 1 GiB und ein Limit von 512 Clients.

Median Anfragen/s, drei Stichproben von fünf Sekunden pro Fall:

Schlüssel/Anfrage Verbindungen Vorbereitetes SQL SQL mget RESP MGET
1 64 277,088 211,251 722,133
1 256 253,790 186,296 839,678
64 64 26,459 38,122 38,877
64 256 27,615 43,647 52,774

SQL mit 64 Schlüsseln variierte über Neustarts des Servers trotz identischer Daten, Einstellungen und Indexpläne zwischen 19–28k Anfragen/s. Die Tabelle verwendet den schnelleren wiederholten Lauf; die Ursache der Variation bleibt ungeklärt. Alle 129 Stichproben enthalten beide Läufe, exakte Quellrevisionen, Binär-Hashes und Abfragepläne.

Schreibgeschützte Cache-Stichproben hatten 100 % Treffer und keine Fehler oder Ablehnungen wegen Verbindungsgrenzen. Der Harness prüft SQL- und RESP- Verbindungsreserven. Eine separate Probe mit 256 Verbindungen, 64 Schlüsseln und 12 Go-Threads verbesserte RESP nicht; SQL mget gewann gegenüber acht Threads 6 %.

Serverressourcen

Bei 256 Verbindungen, Mediane aus denselben Stichproben:

Schlüssel/Anfrage Pfad Client-CPU-Kerne Server-CPU-Kerne (% der VM) Server-µs/Anfrage Abgetasteter Spitzenwert MiB
1 SQL 3.97 8.94 (63.9%) 36.3 679.8
1 SQL mget 3.36 9.93 (70.9%) 54.4 684.2
1 RESP MGET 5.98 6.11 (43.7%) 7.8 263.7
64 SQL 3.72 9.45 (67.5%) 348.3 689.8
64 SQL mget 5.12 4.99 (35.6%) 116.0 707.7
64 RESP MGET 5.76 4.97 (35.5%) 95.8 266.7

Go-Client unter macOS

Über Dockers veröffentlichte Ports, bei 64 Verbindungen; Mediane aus drei Stichproben von fünf Sekunden, in Anfragen/s:

Schlüssel/Anfrage, 64 Verbindungen Vorbereitetes SQL SQL mget RESP MGET
1 49,194 48,010 52,426
64 14,324 15,751 16,240

Die VM- und Host-Fälle unterscheiden sich sowohl beim Client-Betriebssystem als auch bei der Netzwerkroute. Die Host-Port-Ergebnisse können daher die Durchsatzgrenze von PostgreSQL nicht isolieren. RESP hat außerdem einen anderen Sitzungsvertrag: Worker verwenden eine konfigurierte Datenbankrolle und erben weder SQL-Transaktion noch Snapshot des Aufrufers. Siehe die RESP-Referenz.

Reproduzieren

Go-Benchmark ausführen

Vom Repository-Stammverzeichnis mit Docker, Node.js 20+ und Go 1.25+:

./examples/benchmark.sh go > go.json

Das Skript baut einen verworfenen PostgreSQL-Server und den Go-Client, führt jeden Fall dreimal aus, zeichnet Serverressourcen auf und entfernt anschließend seine Container. Der Client läuft in der Docker-VM in einer von PostgreSQL getrennten cgroup. Aktuelle Standardwerte: 4/64/256 Verbindungen, 1/16/64 Schlüssel und fünf Sekunden pro Stichprobe. Verwenden Sie all, um Node.js und Go gegen denselben Server mit der gemeinsamen Matrix auszuführen. Um den aufgezeichneten Lauf zu reproduzieren, verwenden Sie die Revisionen aus dem Mess-JSON.

Optionale Überschreibungen: CONNECTIONS, BATCHES, REPEATS, DURATION_SECONDS und GOMAXPROCS. Das JSON zeichnet die Build-ID der laufenden Erweiterung auf.

Aktualisiert .