
El kernel de Linux proporciona una amplia gama de opciones de configuración que pueden afectar el rendimiento. Se trata de obtener la configuración correcta para su aplicación y carga de trabajo. Como cualquier otra base de datos, PostgreSQL usa el kernel de Linux para una configuración óptima. Las configuraciones mal ajustadas pueden dar como resultado un bajo rendimiento. Por lo tanto, es importante que mida el rendimiento de la base de datos después de cada sesión de ajuste para evitar la degradación del rendimiento. En una de mis publicaciones anteriores, "Ajuste de los parÔmetros del kernel de Linux para la optimización de PostgreSQL", describà algunos de los parÔmetros del kernel de Linux mÔs útiles y cómo pueden ayudarlo a mejorar el rendimiento de la base de datos. Ahora voy a compartir los resultados de mi prueba después de configurar grandes pÔginas de Linux con una carga de trabajo PostgreSQL diferente. Realicé un conjunto exhaustivo de pruebas para diferentes tamaños de carga de PostgreSQL y el número simultÔneo de clientes.
MƔquina de prueba
- Servidor Supermicro:
- CPU IntelĀ® XeonĀ® E5-2683 v3 @ 2.00GHz
- 2 enchufes / 28 nĆŗcleos / 56 hilos
- Memoria: 256 GB de RAM
- Almacenamiento: SAMSUNG SM863 1.9TB Enterprise SSD
- Sistema de archivos: ext4 / xfs
- SO: Ubuntu 16.04.4, kernel 4.13.0-36-generic
- PostgreSQL: versión 11
Configuración del kernel de Linux
Usé la configuración predeterminada del kernel sin ninguna optimización / ajuste que no sea deshabilitar pÔginas grandes transparentes (Transparent HugePages). Las pÔginas grandes transparentes estÔn habilitadas de forma predeterminada y resaltan el tamaño de la pÔgina, que puede no recomendarse para la base de datos. Las bases de datos generalmente requieren pÔginas grandes de tamaño fijo que no estÔn cubiertas por pÔginas grandes transparentes. Por lo tanto, siempre se recomienda deshabilitar esta función y usar pÔginas grandes clÔsicas de forma predeterminada.
Configuración de PostgreSQL
Utilicé la configuración uniforme de PostgreSQL para todas las pruebas para registrar diferentes cargas de trabajo de PostgreSQL con diferentes configuraciones para grandes pÔginas de Linux. Aquà estÔ la configuración de PostgreSQL utilizada para todas las pruebas:
postgresql.confshared_buffers = '64GB' work_mem = '1GB' random_page_cost = '1' maintenance_work_mem = '2GB' synchronous_commit = 'on' seq_page_cost = '1' max_wal_size = '100GB' checkpoint_timeout = '10min' synchronous_commit = 'on' checkpoint_completion_target = '0.9' autovacuum_vacuum_scale_factor = '0.4' effective_cache_size = '200GB' min_wal_size = '1GB' wal_compression = 'ON'
Esquema de prueba
En las pruebas, el esquema de pruebas juega un papel importante. Todas las pruebas se realizan tres veces durante 30 minutos para cada ejecución. Tomé el promedio de estos tres indicadores. Las pruebas se realizaron utilizando la herramienta de prueba de rendimiento PostgreSQL
pgbench . pgbench funciona con un factor de escala, con un factor de escala de aproximadamente 16 MB de carga de trabajo.
PƔginas grandes (pƔginas enormes)
Linux, por defecto, usa pÔginas de memoria 4K junto con pÔginas grandes. BSD tiene Super pÔginas, mientras que Windows tiene pÔginas grandes. PostgreSQL solo admite pÔginas grandes (Linux). En casos de alto uso de memoria, las pÔginas pequeñas reducen el rendimiento. Al instalar pÔginas grandes, aumenta la memoria asignada para la aplicación y, en consecuencia, reduce los costos operativos que surgen durante la asignación / intercambio; es decir, aumenta la productividad con pÔginas grandes.
Aquà estÔ la configuración para pÔginas grandes cuando se utiliza un tamaño de pÔgina grande de 1 GB. Siempre puede obtener esta información de / proc.
$ cat / proc / meminfo | grep -i enorme AnonHugePages: 0 kB ShmemHugePages: 0 kB HugePages_Total: 100 HugePages_Free: 97 HugePages_Rsvd: 63 HugePages_Surp: 0 Hugepagesize: 1048576 kB
Para obtener mÔs información sobre pÔginas grandes, lea mi publicación de blog anterior.
https://www.percona.com/blog/2018/08/29/tune-linux-kernel-parameters-for-postgresql-optimization/Por lo general, las pƔginas grandes tienen 2 MB y 1 GB, por lo que tiene sentido usar 1 GB en lugar de los 2 MB mucho mƔs pequeƱos.
https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/performance_tuning_guide/s-memory-transhugehttps://kerneltalks.com/services/what-is-huge-pages-in-linux/Resultados de la prueba
Esta prueba muestra el efecto general de varios tamaños de pÔginas grandes. El primer conjunto de pruebas se creó con el tamaño de pÔgina predeterminado en Linux 4K sin incluir pÔginas grandes. Tenga en cuenta que las pÔginas enormes transparentes también se deshabilitaron y permanecieron deshabilitadas durante todas estas pruebas.
Luego, el segundo conjunto de pruebas se realizó en pÔginas grandes de 2 MB. Finalmente, el tercer conjunto de pruebas se ejecuta con pÔginas grandes de 1 GB.
Todas estas pruebas se realizaron en PostgreSQL versión 11. Los conjuntos incluyen una combinación de diferentes tamaños de la base de datos y los clientes. El siguiente grÔfico muestra los resultados comparativos de rendimiento para estas pruebas con TPS (transacciones por segundo) en el eje Y, el tamaño de la base de datos y el número de clientes por tamaño de base de datos en el eje X.

Se puede ver en el grÔfico anterior que la ganancia de rendimiento con pÔginas grandes aumenta con el número de clientes y el tamaño de la base de datos, si el tamaño permanece en el búfer previamente asignado en la memoria compartida.
Esta prueba muestra TPS en comparación con el número de clientes. En este caso, el tamaño de la base de datos es de 48 GB. En el eje Y, tenemos TPS, y en el eje X, tenemos el número de clientes conectados. El tamaño de la base de datos es lo suficientemente pequeño como para caber en un búfer compartido que se establece en 64 GB.

Si las pƔginas grandes se configuran en 1 GB, cuantos mƔs clientes, mayor serƔ la ganancia relativa de rendimiento.
El siguiente grÔfico es el mismo que el anterior, excepto por el tamaño de la base de datos de 96 GB. Esto excede el tamaño del búfer compartido, que se establece en 64 GB.

La observación clave aquà es que el rendimiento con pÔginas grandes de 1 GB aumenta a medida que aumenta el número de clientes y, en última instancia, proporciona mÔs rendimiento que las pÔginas grandes de 2 MB o el tamaño de pÔgina estÔndar de 4 KB.
Esta prueba muestra TPS dependiendo del tamaño de la base de datos. En este caso, el número de clientes conectados es 32. En el eje Y, tenemos TPS, y en el eje X - tamaños de base de datos.

Como se esperaba, cuando la base de datos va mƔs allƔ de las pƔginas grandes preasignadas, el rendimiento se reduce significativamente.
Resumen
Una de mis recomendaciones clave es que debemos desactivar Transparent HugePages. VerÔ la mayor ganancia de rendimiento cuando la base de datos se coloca en un búfer compartido con pÔginas grandes habilitadas. Elegir el tamaño de pÔginas grandes requiere una pequeña cantidad de prueba y error, pero esto puede conducir a un aumento significativo en TPS cuando el tamaño de la base de datos es grande, pero sigue siendo lo suficientemente pequeño como para caber en un búfer compartido.