Hoy vamos a ver una entrada sencilla sobre una nueva funcionalidad de la 12c , el parámetro PGA_AGGREGATE_LIMIT
Desde la versión 9i Oracle ha apostado por la gestión automática de la memoria, uno de los problemas que generaba Al motor la gestión total de la configuración del tamaño de la PGA y SGA es que el motor podía llegar a configuraciones donde el espacio asignado a la PGA fuese muy alto, repercutiendo sobre la SGA y produciendo un exceso de paginación en la base de datos.
Como han solucionado esto ?
Sencillamente han introducido un parámetro nuevo llamado PGA_AGGREGATE_LIMIT
Este nuevo parámetro va a ser un límite del tamaño total de las PGAs de la base de datos, al contrario de lo que ocurria con PGA_AGGREGATE_TARGET que actuaba como valor de referencia , el nuevo PGA_AGGREGATE_LIMIT actúa como límite , y no solo no dejará que este valor se sobrepase, sino que eliminará sesiones que estén usando mas memoria PGA con el nuevo error ora
ORA-04036: PGA memory used by the instance exceeds PGA_AGGREGATE_LIMIT
¿Cual es el patrón que usa oracle para matar las sesiones
El proceso de background CKPT comprueba cada tres segundos si la cantidad de memoria usada excede el parámetro PGA_AGGREGATE_LIMIT, si este límite es excedido Oracle hará lo sigiuiente
- Las llamadas de las sesiones que están consumiendo mas PGA son abortadas.(untunable PGA memory)
- Si el tamaño de la PGA sigue por encima del límite, las sessiones y los procesos que mas PGA usan son terminados (untunable PGA memory)
- Los procesos de SYS y background no se ven afectados por estas reglas
El motor notifica al cliente el problema con un ORA-04036: PGA memory used by the instance exceeds PGA_AGGREGATE_LIMIT
¿Como se calcula el valor ?
EL PGA_AGGREGATE_LIMIT es un valor dinámico , por lo que puede modificarse en cualquier momento , su valor es calculado de manera automática en el arranque por el motor al mayor de estos tres valores
- 2 GB
- 200% of PGA_AGGREGATE_TARGET
- PROCESSES ( valor del parámetros de incializacion) * 3 MB
- Nunca excederá al 120% de la memoria física menos el total del tamaño la SGA .
¿Como lo deshabilito?
Si fijamos en el spfile el valor de esta variable a cero, la base de datos se comportará como lo hacía en la version 11g, y no eliminará las sesiones que sobrepasen este límite.
Esto podemos hacerlo con :
alter system set pga_aggregate_limit=0 scope=both;
Mas información en
- Documentacion de Oracle
- Limiting process size with database parameter PGA_AGGREGATE_LIMIT (Doc ID 1520324.1)
