Benchmarks de Go: SQL y RESP

Resumen · Node.js · Go y RESP

Go 1.27.1 con pgx 5.11.0 y un cliente RESP2 de la biblioteca estándar; GOMAXPROCS=8. Máquina y método de medición.

Medido el 15 de septiembre de 2026 con la compilación de la extensión f03ed22. El cliente Go se ejecuta dentro de la VM Linux, en un contenedor separado que comparte el espacio de nombres de red de PostgreSQL. La CPU y memoria del cliente se excluyen de los contadores de recursos del servidor. RESP usa ocho workers, un presupuesto de caché/buffer de 1 GiB y un límite de 512 clientes.

Mediana de solicitudes/s, tres muestras de cinco segundos por caso:

Claves/solicitud Conexiones SQL preparado 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

El SQL de 64 claves varió entre 19 y 28k solicitudes/s entre reinicios del servidor a pesar de que los datos, ajustes y planes de índice eran idénticos. La tabla usa la ejecución repetida más rápida; la causa de la variación sigue sin resolverse. Las 129 muestras incluyen ambas ejecuciones, las revisiones exactas del código fuente, hashes de binarios y planes de consulta.

Las muestras de caché de solo lectura tuvieron un 100% de aciertos y ningún error ni rechazo por límite de conexiones. El arnés comprueba el margen de conexiones de SQL y RESP. Una prueba separada con 256 conexiones, 64 claves y 12 hilos Go no mejoró RESP; SQL mget ganó un 6% frente a ocho hilos.

Recursos del servidor

Con 256 conexiones, medianas de las mismas muestras:

Claves/solicitud Recorrido Núcleos de CPU del cliente Núcleos de CPU del servidor (% de la VM) µs del servidor/solicitud Pico de MiB muestreado
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

Cliente Go en macOS

A través de los puertos publicados por Docker, con 64 conexiones; medianas de tres muestras de cinco segundos, en solicitudes/s:

Claves/solicitud, 64 conexiones SQL preparado SQL mget RESP MGET
1 49,194 48,010 52,426
64 14,324 15,751 16,240

Los casos de la VM y del host difieren tanto en el sistema operativo del cliente como en la ruta de red. Por tanto, los resultados mediante el puerto del host no pueden aislar el límite de rendimiento de PostgreSQL. RESP también tiene un contrato de sesión diferente: los workers usan un rol de base de datos configurado y no heredan la transacción ni el snapshot SQL de quien llama. Consulta la referencia RESP.

Reproduce

Ejecuta el benchmark de Go

Desde la raíz del repositorio, con Docker, Node.js 20+ y Go 1.25+:

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

El script compila un servidor PostgreSQL desechable y el cliente Go, ejecuta cada caso tres veces, registra los recursos del servidor y después elimina sus contenedores. El cliente se ejecuta en la VM de Docker, en un cgroup separado de PostgreSQL. Valores predeterminados actuales: 4/64/256 conexiones, 1/16/64 claves y cinco segundos por muestra. Usa all para ejecutar Node.js y Go contra el mismo servidor con la matriz común. Para reproducir la ejecución registrada, usa las revisiones del JSON de mediciones.

Anulaciones opcionales: CONNECTIONS, BATCHES, REPEATS, DURATION_SECONDS y GOMAXPROCS. El JSON registra el ID de compilación de la extensión en ejecución.

Actualizado .