Hola a todos, hoy os vamos a hablar de latches, un bloqueo Oracle en la memoria.
¿Qué son los Latches?
Los latches proporcionan un mecanismo de serialización de bajo nivel que protege las estructuras de datos compartidas en la SGA. Un latch es un tipo de bloqueo que se puede reclamar y liberar muy rápidamente. Los latches se utilizan normalmente para evitar que más de un proceso ejecute idénticos fragmentos de código en un momento dado. Cuando se toma un latch, el objeto es evitar interbloqueos. Asociado con cada latch hay un procedimiento de limpieza que será invocado si un proceso muere mientras mantiene el latch. Esta limpieza se realiza utilizando los servicios de PMON. La implementación subyacente de los latches depende del sistema operativo, particularmente en lo que respecta a si un proceso esperará un latch y por cuánto tiempo. Algunos ejemplos de latches son los siguientes: latches de buffer cache, latches de library cache, latches de shared pool, latches de redo allocation, latches de archive control y latches de redolog buffer.
¿Cuando se obtienen latches?
Un proceso adquiere un latch cuando trabaja con área de memoria en la SGA (System Global Area). Mantiene el latch durante el período de tiempo que funciona con el área de memoria. El latch finaliza o se libera cuando el proceso termina de trabajar con ese marco o área de memoria. Cada latch protege un conjunto diferente de datos, identificado por el nombre del latch. El objetivo de los latches es administrar el acceso simultáneo a las estructuras de datos compartidas de modo que solo un proceso pueda acceder a la estructura a la vez. Los procesos bloqueados (procesos que esperan ejecutar una parte del código para el cual algún otro proceso ya ha obtenido un latch) esperarán hasta que se libere el latch. Oracle usa instrucciones atómicas como test and set para operar en latches. Dado que las instrucciones para establecer y liberar latches son atómicas, el sistema operativo garantiza que solo un proceso lo obtenga y, dado que es solo una instrucción, es bastante rápido.
¿Cuáles son los posibles modos de solicitud de bloqueo?
Las solicitudes de bloqueo se pueden realizar de dos modos:
willing to wait:
una solicitud de modo “willing to wait” se repetirá, esperará y volverá a solicitar hasta que se obtenga el latch. Ejemplos de latchs “willing to wait” son latches de library cache y shared pool.
No wait : En modo «no esperar», el proceso solicitará el latch y si no está disponible, en lugar de esperar, se solicitará otro. Cuando no hay un latch adquirible, el proceso del servidor tiene que esperar. Un ejemplo de latch “no wait” es el latch de redo copy.
Spin count: El spin count controla cuántas veces el proceso volverá a intentar obtener el bloqueo antes de retroceder e irse a dormir. Básicamente, esto significa que el proceso se encuentra en un bucle cerrado de CPU.
¿Qué causa la contención de latches?
Si un proceso intenta adquirir un latch y se encuentra ocupado entra en un proceso de espera que se denomina spinning , lo vuelve a intentar y, si el latch sigue ocupado, vuelve a entrar en espera. El número de veces que el proceso entra en espera está determinado por el valor del parámetro oculto _spin_count. La primera vez que el proceso entra en espera se queda en ese estado durante una centésima de segundo y, si tiene que volverá entrar en dicho estado, el valor de la espera se va duplicando en cada entrada en tiempo de espera. Lógicamente, a medida que el proceso está en tiempo de espera se produce un consumo adicional de CPU hasta el latch solicitado queda disponible y, en consecuencia, una penalización de rendimiento. Podríamos afirmar que el uso de CPU es proporcional al tiempo que el proceso se encuentra en spinning. Esto es lo que se denomina contención de latches y puede llegar a penalizar seriamente el rendimiento de la BBDD.
Si necesitas ayuda con tus bases de datos Oracle, puedes consultar nuestros servicios de Soporte Oracle. Puedes contactarnos sin compromiso, en nuestra página de contacto.