4 puntos por GN⁺ 2025-05-08 | 2 comentarios | Compartir por WhatsApp
  • Postgres 18, actualmente en beta1, incorpora soporte para I/O asíncrona (Asynchronous I/O), mejorando de forma importante el rendimiento de lectura en entornos de nube
  • Con el nuevo parámetro io_method, se puede elegir además del método sync tradicional, los modos worker e io_uring
  • Según benchmarks en AWS, con io_uring el rendimiento de lectura desde disco mejora hasta 3 veces
  • Sin embargo, con la asincronía también se vuelve más difícil interpretar los tiempos de I/O en el análisis de consultas existente (EXPLAIN ANALYZE)
  • Se requiere optimización de rendimiento mediante la nueva vista de monitoreo (pg_aios) y el parámetro de ajuste effective_io_concurrency

Incorporación de I/O asíncrona en Postgres 18

  • Tradicionalmente, Postgres ha usado un modelo de I/O bloqueante, esperando a que cada lectura de disco termine
  • La alta latencia en almacenamiento basado en red (como EBS) provoca cuellos de botella en entornos de nube
  • La I/O asíncrona permite procesar varias lecturas de disco en paralelo, elevando el uso de CPU y el throughput total

Trabajo previo en Postgres 17: Read Stream API

  • En Postgres 17 se introdujo la API read_stream para estandarizar la abstracción de las operaciones de lectura
  • Pero seguía dependiendo del caché de páginas del SO y no se reflejaba directamente en el shared buffer de Postgres
  • En Postgres 18 ahora es posible hacer lecturas asíncronas directas, no solo sugerencias al kernel

Nueva configuración: io_method

  • Postgres 18 agrega la configuración io_method en postgresql.conf, con estas 3 opciones:

io_method = sync

  • El mismo método síncrono de Postgres de siempre
  • Usa un mecanismo de solicitud anticipada de lectura basado en posix_fadvise()

io_method = worker (predeterminado)

  • Un proceso worker dedicado a I/O lee datos de forma asíncrona y los entrega al shared buffer
  • El proceso principal puede seguir ejecutándose sin interrumpirse por las lecturas
  • El número predeterminado de workers es 3 y puede ajustarse con io_workers

io_method = io_uring

  • Una interfaz de I/O de alto rendimiento disponible en Linux kernel 5.1 o superior
  • Realiza lecturas asíncronas directamente mediante un ring buffer compartido con el kernel, sin procesos worker
  • Requiere kernel, sistema de archivos y configuración modernos

Benchmark de rendimiento de la I/O asíncrona (según AWS)

  • Entorno de prueba:
    • AWS c7i.8xlarge (32 vCPU, 64GB RAM)
    • EBS io2 de 100GB, 20,000 IOPS
    • Ejecución de SELECT COUNT(*) sobre una tabla de 3.5GB

Comparación de rendimiento con caché fría:

Versión/configuración Tiempo de ejecución (ms)
Postgres 17 (sync) 15,831
Postgres 18 (sync) 15,071
Postgres 18 (worker) 10,052
Postgres 18 (io_uring) 5,723
  • io_uring ofrece una mejora de rendimiento de 2.8 veces frente a sync
  • Es especialmente eficaz para minimizar la latencia de disco en la nube

Ajuste de effective_io_concurrency

  • En Postgres 18, este parámetro influye en la cantidad interna de solicitudes asíncronas de read-ahead
  • Su valor predeterminado subió de 1 a 16, y junto con io_combine_limit determina el rango máximo de lectura
  • En entornos de nube con alta latencia, un valor grande puede ser favorable, pero se necesitan benchmarks según la carga de trabajo

Nueva herramienta de monitoreo: pg_aios

  • En pg_stat_activity, durante operaciones asíncronas aparece el evento AioIoCompletion, lo que dificulta analizar la espera del backend
  • En el caso de io_uring, como el kernel procesa directamente la I/O, el estado no es visible desde Postgres
  • La vista pg_aios permite consultar información detallada de las solicitudes asíncronas en curso
    SELECT * FROM pg_aios;  
    
  • Permite ver estados como SUBMITTED, COMPLETED_IO y la información del bloque objetivo

Precaución: cambio en la interpretación de la información de tiempos de I/O

  • Los I/O Timings que se veían en EXPLAIN ANALYZE solo son confiables en el modo síncrono
  • Al usar worker o io_uring con asincronía, la ejecución en paralelo y la distribución entre workers distorsionan la interpretación de los tiempos
  • Para evaluar el esfuerzo real de I/O, se recomienda usar la cantidad de buffers shared read y pg_aios

Conclusión

  • Postgres 18 aporta una mejora real al rendimiento de cargas de trabajo centradas en lectura
  • En particular, puede ofrecer grandes ventajas al usar discos de alta latencia en entornos de nube
  • Al mismo tiempo, exige reaprender cómo interpretar métricas de observabilidad, hacer tuning y aplicar la configuración
  • Para Postgres 19 también se espera soporte para escritura asíncrona

2 comentarios

 
jujumilk3 2025-05-09

Postgres de verdad es lo máximo, genial

 
GN⁺ 2025-05-08
Comentarios en Hacker News
  • En Linux se puede usar preadv2(..., RWF_NOWAIT) para realizar lecturas asíncronas desde la caché de páginas. Esto podría ser útil para reducir la latencia con io_method = worker
    • Se propone intentar la lectura con NOWAIT en el hilo principal y delegarla a un hilo de trabajo solo si falla
  • Hay una pregunta sobre si esta nueva función de I/O asíncrona es exclusiva de Linux
    • Windows tiene IOCP y su propia implementación de IORing, y macOS soporta POSIX AIO
    • Se señala que no se menciona mucho la implementación de IORing en Windows
  • Se ha trabajado bastante en aio(4) de FreeBSD, y sería interesante ver cómo funciona dado que no tiene las desventajas de aio de Linux/glibc
  • Hay una pregunta sobre la similitud con InnoDB de MySQL
  • Hay preocupación por los problemas de seguridad de io_uring, y se pregunta si muchos administradores o distribuciones de Linux lo están deshabilitando
  • Hay una opinión de que les gustaría llevar esta función a producción sobre NVMe, y esperan que los principales proveedores de nube la ofrezcan lo antes posible
    • La mejora de rendimiento es muy atractiva
  • Se comparte la experiencia de desplegar Postgres en un servidor Hetzner EX-44
    • La relación precio-rendimiento es excelente y ofrece capacidad de nivel empresarial a bajo costo
    • Se refuerza la seguridad usando TailScale y eliminando por completo la exposición a la red pública
    • El enfoque de optimización incluye configuración por carga de trabajo con PGTune, monitoreo de rendimiento en tiempo real con PgHero y tareas automáticas de VACUUM ANALYZE con pgcron
    • Se desarrolló una utilidad CLI personalizada para respaldos comprimidos con ZSTD, manteniendo una alta tasa de compresión y un alto rendimiento, con soporte para subida automática a S3
    • Esta configuración es estable, tiene gran rendimiento y deja bastante margen para crecer
  • Hay un comentario en tono de burla sobre los 20k IOPS de las instancias de AWS
    • Los NVMe de consumo ofrecen ~1 millón+ de IOPS, y se espera que aumenten aún más con PCIe 5.0 NVMe
    • Se considera que muchas limitaciones arbitrarias de la nube causan numerosos problemas
    • El I/O asíncrono es muy útil, pero será menos importante en NVMe de 1 millón de IOPS
    • Los costos de la nube son muy altos y la diferencia de rendimiento frente al hardware de consumo barato es grande
  • Hay una pregunta sobre la comparación de rendimiento entre Postgres, MariaDB y Percona
    • Se preguntan en qué casos destaca cada base de datos
  • Hay una pregunta sobre cuándo saldrá una actualización que permita más conexiones concurrentes
    • Esperan poder dejar de usar pgbouncer