Estoy tratando de hacer que PostgreSQL aspire mi base de datos de forma agresiva. Actualmente he configurado el vacío automático de la siguiente manera:
- autovacuum_vacuum_cost_delay = 0 # Apague el vacío basado en costos
- autovacuum_vacuum_cost_limit = 10000 # Valor máximo
- autovacuum_vacuum_threshold = 50 # Valor predeterminado
- autovacuum_vacuum_scale_factor = 0.2 # Valor predeterminado
Noté que el vacío automático solo se activa cuando la base de datos no está bajo carga, por lo que me meto en situaciones en las que hay muchas más tuplas muertas que tuplas vivas. Vea la captura de pantalla adjunta para ver un ejemplo. Una de las mesas tiene 23 tuplas vivas, pero 16845 tuplas muertas en espera de vacío. ¡Eso es una locura!
El vacío automático se activa cuando finaliza la ejecución de la prueba y el servidor de la base de datos está inactivo, que no es lo que quiero, ya que me gustaría que se activara el vacío automático cada vez que el número de tuplas muertas supere el 20% de tuplas vivas + 50, ya que la base de datos ha sido configurado El vacío automático cuando el servidor está inactivo es inútil para mí, ya que se espera que el servidor de producción alcance miles de actualizaciones / segundo durante un período prolongado, por lo que necesito el vacío automático para funcionar incluso cuando el servidor está bajo carga.
¿Hay algo que me falta? ¿Cómo fuerzo el vacío automático para que se ejecute mientras el servidor está bajo una carga pesada?
Actualizar
¿Podría ser esto un problema de bloqueo? Las tablas en cuestión son tablas de resumen que se completan mediante un desencadenador de inserción posterior. Estas tablas están bloqueadas en el modo COMPARTIR EXCLUSIVA DE LA FILA para evitar escrituras concurrentes en la misma fila.
fuente
Aumentar la cantidad de procesos de autovacío y reducir la siesta probablemente ayudará. Aquí está la configuración para un PostgreSQL 9.1 que uso en un servidor que almacena información de respaldo y, como resultado, obtiene mucha actividad de inserción.
http://www.postgresql.org/docs/current/static/runtime-config-autovacuum.html
También intentaré bajar el nivel
cost_delay
para que la aspiradora sea más agresiva.También puedo probar el autovacuuming usando pgbench.
http://wiki.postgresql.org/wiki/Pgbenchtesting
Ejemplo de alta contención:
Crear una base de datos bench_replication
Ejecute pgbench
Verificar el estado de aspiración automática
fuente
El script "calificar para autovacuum" existente es muy útil, pero (como se indicó correctamente) faltaban opciones específicas de la tabla. Aquí hay una versión modificada que tiene en cuenta esas opciones:
fuente