Em RAC, cada instância tem o seu buffer cache. Quando a sessão precisa de um bloco cuja versão está em outra instância, ela espera a troca pelo interconnect: são os eventos gc. Muito tempo neles quer dizer que as instâncias disputam os mesmos blocos.
Sintomas
No Diagnóstico, aparece o achado Troca de blocos entre instâncias do RAC (CLUSTER). O texto diz quanto do tempo total ficou na classe de espera Cluster, em percentual e em segundos, lista os eventos da classe que pesaram e termina com Ver perfil por classe.
O achado aparece quando a classe Cluster pesa bastante no tempo total: em RAC, alguma troca de blocos é normal. A severidade é sempre média. Entram na classe os eventos gc, como gc cr block 2-way, gc current block busy e gc buffer busy acquire.
O cartão de cada evento gc, que abre ao clicar no nome dele no perfil, explica os nomes: cr é leitura consistente e current é a versão atual do bloco, para alterar; 2-way e 3-way contam as instâncias envolvidas; grant é a permissão para ler do disco; busy quer dizer que o bloco estava em uso no outro nó.
Causa
- A mesma parte da aplicação roda em mais de uma instância e altera os mesmos blocos: cada alteração leva o bloco de uma instância para a outra.
- Blocos quentes: índice com chave crescente (sequence, data), sequence com
orderou cache pequeno, tabela pequena de controle que todas as sessões atualizam. - Interconnect lento ou instância remota sobrecarregada: cada troca demora, e pesam os eventos com
busyecongestedno nome.
Resolução
Ver quais eventos pesam e quanto dura cada troca
No perfil, compare Ocorrências e Média (s) dos eventos gc. O cartão do evento considera normal pouco tempo por bloco, abaixo de 1 ms com interconnect bom. Muitas trocas rápidas apontam para disputa dos mesmos blocos; poucas trocas lentas, para o interconnect ou para a carga da outra instância.
Concentrar o serviço numa instância
O cartão Sessão e ambiente, no Resumo, mostra a Instância e o Serviço do trace. Veja em que instâncias estão as sessões de cada serviço:
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;
Se o mesmo serviço roda em todas as instâncias e as sessões dele alteram as mesmas tabelas, configure o serviço com uma instância preferida e as outras como disponíveis: a carga fica numa instância, e as outras assumem só na falha. A documentação da Oracle sobre serviços no RAC descreve a configuração.
Desfazer os blocos quentes
- Sequence: cache maior e
noorder, para cada instância usar a sua faixa de números (alter sequence exemplo.pedido_seq cache 1000 noorder;). - Índice com chave crescente: índice reverse key ou particionado por hash, como em inserção concorrente no mesmo bloco.
- Tabela pequena que todos atualizam: separe as linhas por instância ou por sessão.
Interconnect e instância remota
Com média alta por troca, o problema está fora da sessão: a rede do interconnect ou a CPU da outra instância, onde os processos LMS atendem os pedidos de bloco. Leve ao DBA a média dos eventos gc e o Período do trace.
Como confirmar
- Aplique uma mudança por vez: serviço com instância preferida, sequence com cache ou índice novo.
- Ligue o trace da mesma operação com esperas, na instância em que ela roda agora (ligar o trace com o DBMS_MONITOR).
- Envie o arquivo novo e abra o relatório.
- Compare a linha Cluster em Por classe de espera e os eventos gc no perfil.
Resultado: a classe Cluster deixa de pesar no tempo total e o achado some do Diagnóstico. Com a carga numa instância só, as Ocorrências dos eventos gc caem; com o interconnect resolvido, cai a Média (s).
No relatório
O relatório de exemplo não tem espera da classe Cluster; os links abrem as mesmas seções nele.
- Resumo: o cartão Sessão e ambiente, com Instância e Serviço (resumo).
- Diagnóstico: o achado, com o link Ver perfil por classe.
- Por classe de espera: a linha Cluster, com os eventos gc em Principais componentes (classes de espera).
- Perfil do tempo de resposta: cada evento gc, com Ocorrências e Média (s), e o cartão Bloco de outra instância (RAC) (perfil).
- Objetos com mais tempo de espera: as tabelas e os índices trocados entre as instâncias (objetos).
- Principais comandos por componente e por classe: os comandos que mais esperaram blocos de outra instância (comandos por componente).
Numa coleta com sessões de instâncias diferentes, a tabela Sessões da coleta mostra a instância de cada sessão (coleta).