Tengo algunas preguntas sobre esta opción. Está claro que, por defecto, esta opción está comentada en app.yml y puede mejorar el rendimiento de la ordenación, pero aumenta el uso de memoria por conexión, pero ¿qué significa realmente? ¿Depende de la cantidad de conexiones? ¿Qué es db_work_mem? ¿Se configura automáticamente al instalar Discourse, al igual que db_shared_buffers y UNICORN_WORKERS? ¿Es algo seguro activarlo o es para usuarios avanzados?
Actualmente se ve así: #db_work_mem: "40MB"
El servidor es: Vultr High Frequency Compute 2 vCore, 4096 MB
Es un tema complejo. Puedes buscar en la documentación de PostgreSQL para obtener más detalles. Hay varios temas que tratan sobre la optimización aquí.
Los valores predeterminados funcionan bastante bien.
Si estás experimentando un problema, puedes describirlo e indicar cuánta carga manejas y el tamaño de tu base de datos.
¡Gracias, Jay! En realidad, solo me interesa el tema. Estoy buscando formas de mejorar el rendimiento del foro, pero si puede causar problemas, quizás sea mejor dejarlo comentado.
Entonces, si lo activo, ¿hay un buen riesgo de quedarse sin memoria si la configuración no es correcta o si aumenta el tráfico? Si lo he entendido bien.
work_mem ( integer )
Establece la cantidad máxima base de memoria que puede utilizar una operación de consulta (como un ordenamiento o una tabla hash) antes de escribir en archivos temporales en disco. Si este valor se especifica sin unidades, se interpreta en kilobytes. El valor predeterminado es cuatro megabytes ( 4MB ). Tenga en cuenta que, para una consulta compleja, varias operaciones de ordenamiento o hash pueden ejecutarse en paralelo; cada operación generalmente podrá utilizar tanta memoria como especifique este valor antes de comenzar a escribir datos en archivos temporales. Además, varias sesiones en ejecución podrían estar realizando dichas operaciones simultáneamente. Por lo tanto, la memoria total utilizada podría ser muchas veces el valor de work_mem; es necesario tener esto en cuenta al elegir el valor. Las operaciones de ordenamiento se utilizan para ORDER BY, DISTINCT y uniones por mezcla. Las tablas hash se utilizan en uniones por hash, agregación basada en hash y procesamiento basado en hash de subconsultas IN.
Las operaciones basadas en hash son generalmente más sensibles a la disponibilidad de memoria que las operaciones equivalentes basadas en ordenamiento. La memoria disponible para las tablas hash se calcula multiplicando work_mem por hash_mem_multiplier. Esto permite que las operaciones basadas en hash utilicen una cantidad de memoria que supera la cantidad base habitual de work_mem.
A veces ayuda aumentar la memoria de trabajo al doble del valor predeterminado comentado. Creo que es útil en un sitio grande donde los índices son extensos, pero en su mayoría no lo sé. He roto un sitio al empujarlo a niveles muy altos.
Si quieres experimentar con la configuración, puedes revisar el plugin de Prometheus y crear gráficos atractivos con Grafana.
Por defecto, está configurado para 100 conexiones.
RAM total * 0.25 / max_connections
Tengo 4096 MB * 0.25 / 100 = ~10 MB
En la plantilla postgres.template.yml, el valor predeterminado de db_work_mem: "10MB" parece calcularse con esta fórmula. Creo que estos 10 MB son el máximo actualmente. Gracias, Jay