En RAC, cada instancia tiene su propio buffer cache. Cuando la sesión necesita un bloque cuya versión está en otra instancia, espera el intercambio por el interconnect: son los eventos gc. Mucho tiempo en ellos significa que las instancias se disputan los mismos bloques.
Síntomas
En el Diagnóstico aparece el hallazgo Intercambio de bloques entre instancias del RAC (CLUSTER). El texto dice cuánto del tiempo total quedó en la clase de espera Cluster, en porcentaje y en segundos, lista los eventos de la clase que pesaron y termina con Ver perfil por clase.
El hallazgo aparece cuando la clase Cluster pesa bastante en el tiempo total: en RAC, cierto intercambio de bloques es normal. La gravedad es siempre media. Entran en la clase los eventos gc, como gc cr block 2-way, gc current block busy y gc buffer busy acquire.
La tarjeta de cada evento gc, que se abre al hacer clic en su nombre en el perfil, explica los nombres: cr es lectura consistente y current es la versión actual del bloque, para modificarlo; 2-way y 3-way cuentan las instancias involucradas; grant es el permiso para leer del disco; busy significa que el bloque estaba en uso en el otro nodo.
Causa
- La misma parte de la aplicación se ejecuta en más de una instancia y modifica los mismos bloques: cada modificación lleva el bloque de una instancia a la otra.
- Bloques calientes: un índice con clave creciente (secuencia, fecha), una secuencia con
ordero caché pequeña, una tabla pequeña de control que todas las sesiones actualizan. - Interconnect lento o instancia remota sobrecargada: cada intercambio tarda, y pesan los eventos con
busyycongesteden el nombre.
Solución
Ver qué eventos pesan y cuánto dura cada intercambio
En el perfil, compare Ocurrencias y Media (s) de los eventos gc. La tarjeta del evento considera normal poco tiempo por bloque, por debajo de 1 ms con un buen interconnect. Muchos intercambios rápidos apuntan a contención por los mismos bloques; pocos intercambios lentos, al interconnect o a la carga de la otra instancia.
Concentrar el servicio en una instancia
La tarjeta Sesión y entorno, en el Resumen, muestra la Instancia y el Servicio del trace. Vea en qué instancias están las sesiones de cada servicio:
select service_name, inst_id, count(*) as sessoes
from gv$session
where type = 'USER'
group by service_name, inst_id
order by service_name, inst_id;
Si el mismo servicio se ejecuta en todas las instancias y sus sesiones modifican las mismas tablas, configure el servicio con una instancia preferida y las otras como disponibles: la carga queda en una instancia, y las otras asumen solo en caso de falla. La documentación de Oracle sobre servicios en RAC describe la configuración.
Deshacer los bloques calientes
- Secuencia: caché más grande y
noorder, para que cada instancia use su propio rango de números (alter sequence exemplo.pedido_seq cache 1000 noorder;). - Índice con clave creciente: índice reverse key o particionado por hash, como en inserción concurrente en el mismo bloque.
- Tabla pequeña que todos actualizan: separe las filas por instancia o por sesión.
Interconnect e instancia remota
Con una media alta por intercambio, el problema está fuera de la sesión: la red del interconnect o la CPU de la otra instancia, donde los procesos LMS atienden los pedidos de bloque. Lleve al DBA la media de los eventos gc y el Período del trace.
Cómo confirmar
- Aplique un cambio por vez: servicio con instancia preferida, secuencia con caché o índice nuevo.
- Active el trace de la misma operación con esperas, en la instancia en la que se ejecuta ahora (activar el trace con DBMS_MONITOR).
- Envíe el archivo nuevo y abra el informe.
- Compare la fila Cluster en Por clase de espera y los eventos gc en el perfil.
Resultado: la clase Cluster deja de pesar en el tiempo total y el hallazgo desaparece del Diagnóstico. Con la carga en una sola instancia, bajan las Ocurrencias de los eventos gc; con el interconnect resuelto, baja la Media (s).
En el informe
El informe de ejemplo no tiene esperas de la clase Cluster; los enlaces abren las mismas secciones en él.
- Resumen: la tarjeta Sesión y entorno, con Instancia y Servicio (resumen).
- Diagnóstico: el hallazgo, con el enlace Ver perfil por clase.
- Por clase de espera: la fila Cluster, con los eventos gc en Componentes principales (clases de espera).
- Perfil del tiempo de respuesta: cada evento gc, con Ocurrencias y Media (s), y la tarjeta Bloque de otra instancia (RAC) (perfil).
- Objetos con más tiempo de espera: las tablas y los índices intercambiados entre las instancias (objetos).
- Sentencias principales por componente y por clase: las sentencias que más esperaron bloques de otra instancia (sentencias por componente).
En una colección con sesiones de instancias diferentes, la tabla Sesiones de la colección muestra la instancia de cada sesión (colección).