
Hola Habr! Les presento la traducción del artículo original
"PostgreSQL benchmark en FreeBSD, CentOS, Ubuntu Debian y openSUSE" por Martin Kováčik. Examina las pruebas DBMS PostgreSQL 10.1 en entornos cercanos a condiciones reales en varios sistemas Unix.
Traducción
En esta publicación, voy a mostrar los resultados de la prueba de PostgreSQL 10.1 recientemente lanzado. Revisé la base de datos en estos sistemas operativos (todos de 64 bits):
- Ubuntu 16.04 , kernel 4.10.0-38-genérico
- openSUSE 42.3, kernel 4.4.87-25-default
- CentOS 7.4 , kernel 3.10.0-693.2.2.el7.x86_64
- Debian 9.2 , kernel 4.9.0-4-amd64
- FreeBSD 11.1
Metodología de prueba
El objetivo de la prueba era medir el rendimiento de PostgreSQL en condiciones similares a las implementaciones de producción (típicas):
- los clientes se conectan a través del grupo de conexiones para asegurarse de que no haya una reconexión permanente a la base de datos (no utilicé el grupo de conexiones, en su lugar no utilicé el indicador -C pgbench)
- Los clientes se conectan a través de una red, no a través de un socket Unix
- Directorio de datos PostgreSQL ubicado en el espejo RAID 1
Para cada uno de los sistemas operativos probados, se creó una base de datos de control de ~ 74 GB:
pgbench -i -s 5000 pgbench
La infraestructura de prueba consistió en dos servidores dedicados conectados a una red de 1 Gbps:
- EX41-SSD: Intel i7-6700, 4 núcleos, 8 hilos, 32 GB de RAM DDR4, utilizados para generar consultas SQL utilizando pgbench
- PX121-SSD: Intel Xeon E5-1650 v3, 6 núcleos, 12 hilos, 256 GB RAM DDR4 ECC, 2 x 480 GB SATA 6 Gb / s, centro de datos de la serie SSD, utilizado como servidor PostgreSQL
Estaba interesado en estas combinaciones de prueba:
- 32 GB de solo lectura: prueba de solo lectura (solo muestras sin cambiar los datos), el conjunto de datos no cabe en el caché de PostgreSQL
- 200 GB de solo lectura: prueba de solo lectura, el conjunto de datos se almacena en caché en PostgreSQL
- 32 GB TCP-B : lectura-escritura, el conjunto de datos no cabe en el caché PostgreSQL
- TCP-B 200 GB : lectura, escritura, el conjunto de datos se almacena en caché en PostgreSQL
configuración de pgbench
El programa pgbench versión 10.1, que se ejecuta en una computadora FreeBSD 11.1 separada, se utilizó para generar la carga. El script de prueba constaba de tres partes: vacío + calentamiento, una prueba de solo lectura y una prueba de lectura y escritura. Antes de cada prueba de lectura y escritura, se borraron las tablas pgbench (se usó el indicador -v). Durante la prueba, aumenté gradualmente el número de clientes que acceden a la base de datos.
Configuración del servidor PostgreSQL
Para las distribuciones de Linux, PostgreSQL se instaló en el sistema de archivos ext4 en la configuración RAID1 (software RAID usando mdraid) en dos SSD con
atime deshabilitado. En el caso de FreeBSD, el sistema de archivos OpenZFS se utilizó en dos SSD al configurar RAID1. Se creó un conjunto de datos ZFS con datos PostgreSQL con los siguientes parámetros:
zfs get recordsize,logbias,primarycache,atime,compression zroot/var/db/postgres NAME PROPERTY VALUE SOURCE zroot/var/db/postgres recordsize 8K local zroot/var/db/postgres logbias throughput local zroot/var/db/postgres primarycache all default zroot/var/db/postgres atime off inherited from zroot zroot/var/db/postgres compression lz4 local
La configuración del servidor PostgreSQL fue la misma en todos los sistemas operativos, excepto en las rutas de archivos (cada sistema operativo utiliza su propia estructura de directorios). El contenido del archivo
postgresql.conf (configuración básica) para una instancia de 32 GB:
autovacuum = off default_statistics_target = 100 maintenance_work_mem = 1GB checkpoint_completion_target = 0.9 effective_cache_size = 24GB work_mem = 104MB wal_buffers = 16MB shared_buffers = 8GB max_connections = 300
El contenido del archivo
postgresql.conf para la instancia de 200 GB:
autovacuum = off default_statistics_target = 100 maintenance_work_mem = 2GB checkpoint_completion_target = 0.9 effective_cache_size = 144GB work_mem = 640MB wal_buffers = 16MB shared_buffers = 48GB max_connections = 300
Benchmarking
Probé PostgreSQL en cinco sistemas operativos diferentes en dos modos: solo lectura y TCP-B (lectura-escritura) con dos perfiles de memoria diferentes. La prueba de cada sistema operativo tomó aproximadamente 30 horas (sin contar el tiempo requerido para configurar el sistema operativo). Los resultados de cada ejecución de pgbench se guardaron para una evaluación posterior.
Resultados: solo lectura




Resultados - TCP-B




Resumen
La prueba mostró que la diferencia entre las diversas distribuciones de GNU / Linux no es muy significativa. OpenSUSE 42.3 fue el mejor sistema operativo en la prueba de solo lectura, mientras que FreeBSD corrió aproximadamente un 40% más lento. Desafortunadamente, no descubrí qué causó el desempeño mediocre de FreeBSD.
Se obtuvo una imagen más realista del rendimiento de PostgreSQL en la prueba de lectura-escritura (TCP-B). Entre las distribuciones de GNU / Linux, Centos 7.4 fue el más rápido y Debian 9.2 el más lento. Me sorprendió gratamente FreeBSD 11.1, que funcionaba más del doble de rápido que el mejor Linux, a pesar de que FreeBSD usaba ZFS, que es un sistema de archivos de copia en escritura. Supuse que esta diferencia era causada por el costo del software RAID en Linux, así que hice tres pruebas TCP-B más para 100 clientes concurrentes, esta vez sin software RAID:
- FreeBSD 11.1 + UFS : 5623.86 TPS
- FreeBSD 11.1 + ZFS : 8331.85 TPS
- CentOS 7.4 + ext4 : 8987.65 TPS
Los resultados muestran la ineficiencia de RAID SW de Linux (o la eficiencia de RAID ZFS). El rendimiento de CentOS 7.4 sin SW RAID es solo ligeramente superior al de FreeBSD 11.1 con ZFS RAID (para TCP-B y 100 clientes concurrentes).