¿Es posible monitorear el rendimiento del servidor PostgreSQL desde dentro de una función PL / PGSQL?

Aug 17 2020

Esto puede sonar exótico, me gustaría saber mediante programación si es un "buen momento" para ejecutar una función PL / PGSQL de escritura pesada en un servidor. Por "buen momento" me refiero a considerar algún indicador directo o calculado del nivel de carga, nivel de concurrencia o cualquier otra magnitud del servidor PostgreSQL.

Soy consciente de que existe una serie de aplicaciones avanzadas especializadas en el seguimiento del rendimiento, como https://www.datadoghq.com. Pero solo quiero un KPI interno simple que altere o retrase la ejecución de estos procedimientos de escritura pesada hasta que llegue un 'mejor momento'.

Algunos de estos procedimientos depuran tablas, algunos hacen cálculos de promedios / sumas en millones de filas, algunos verifican tablas remotas, etc. Pueden esperar minutos u horas para un "mejor momento" cuando la presión del usuario concurrente disminuye.

¿Alguna idea?

Respuestas

3 jjanes Aug 16 2020 at 23:56

Puede ver cuántas otras sesiones están activas por algo como:

select count(*) from pg_stat_activity where state='active';

Pero debe ser un superusuario o tener el rol pg_monitor, o de lo contrario el estado será NULL para las sesiones de otros usuarios. Si eso le molesta, puede escribir una función con SEGURIDAD DEFINER para permitir el acceso a esta información. (Probablemente debería poner esto en su propia función de todos modos, lo que significa que no hay ninguna razón por la que deba implementarse en plpgsql a menos que ese sea el único idioma disponible para usted).

También puede invocar cualquier operación arbitraria del sistema operativo utilizando un lenguaje pl con privilegios adecuados. Eso incluye de plpgsql , abusando de COPY...FROM PROGRAM.