Várias instâncias Oracle - esta é uma boa prática?

9

Um de meus clientes implantou o banco de dados de nosso produto em uma máquina Solaris que já possui 3 instâncias do Oracle. Portanto, neste momento, existem 4 instâncias do Oracle em execução na mesma máquina. E agora estamos enfrentando problemas de desempenho.

Não tenho acesso a outras instâncias ou à máquina e todas as ferramentas que tenho são alert.log, AWR e ADDM. Eu sei que há algo relacionado a várias instâncias, mas não posso provar.

Então, minha pergunta é: você já passou por uma situação semelhante? Como devo lidar com isso? Como posso identificar a causa dos problemas de desempenho relacionados a várias instâncias?

Isaac A. Nugroho
fonte

Respostas:

8

Isaac, de preferência executamos uma instância em um servidor e implementamos os diferentes aplicativos como esquemas e serviços nesse único banco de dados. Se o servidor tiver memória suficiente, não haverá problema, se todos os aplicativos se comportarem como bons cidadãos do Oracle. Assim que houver um aplicativo que não use variáveis ​​de ligação, haverá uma dor crescente no host. O mesmo para aplicativos que continuam criando novas conexões a cada poucos segundos, em vez de reutilizar as conexões existentes. Coisas como auto commit também não ajudam a melhorar a situação. Qual é o comportamento normal do seu aplicativo? Faz grandes atualizações? Quando faz um commit? Quanto refazer é gerar / hora? Seu aplicativo usa variáveis ​​de ligação? Em muitos casos, a localização dos arquivos de redolog online é crítica. Se o aplicativo gerar muito refazer (ou concorrer com outro aplicativo que faça isso), o gravador de log diminuirá a velocidade e causará uma grande degradação no desempenho porque a sessão está aguardando a conclusão da gravação do arquivo de log. Ofereça ao cliente um layout de disco em que os refazeres estão em discos RAID-10 dedicados e veja quanto isso ajuda. Descubra também a situação de alocação de memória. Pode haver uma necessidade de uma redistribuição justa da memória disponível.

Eu espero que isso ajude

ik_zelf
fonte
você está certo. Nós monitoramos nossa instância e realizamos otimização sempre que possível. Mas o desempenho não é estável, às vezes cai sem motivo explicável (do nosso lado) #
Isaac A. Nugroho
Isaac, com que frequência o banco de dados é reiniciado, qual é a versão e você tem histrogramas em colunas, gerados pelo processo de estatísticas automáticas? Você usa variáveis ​​de ligação e pré-visualização do otimizador?
ik_zelf
2

A execução de várias instâncias no mesmo servidor é possível e, em alguns casos, necessária. O oratab foi projetado especificamente para lidar com o gerenciamento de várias instâncias. Nos casos em que você possui vários aplicativos independentes, pode ser preferível ter uma instância para cada aplicativo.

Ter memória suficiente é fundamental. O Oracle constrói o SGA na memória compartilhada. Se você não tiver memória suficiente, o SGA ou os processos começarão a ser trocados. Isso é conhecido como thrashing e resulta em uma penalidade de desempenho significativa.

Pode ser possível ajustar as instâncias para executar com um SGA menor. A Oracle fornece ferramentas para ajudar a ajustar o tamanho da SGA. Se alguma das instâncias tiver um SGA excessivamente grande, penalizará todas as instâncias.

Outro uso importante da memória é o espaço no buffer. Isso atua como cache secundário e pode eliminar E / S de leitura significativa.

A execução sar(assumindo que o Unix tenha base no sistema operacional) pode fornecer bons diagnósticos sobre onde está o problema. Os problemas prováveis ​​são a troca ou a saturação de E / S do disco. A adição de RAM provavelmente solucionará um desses problemas.

A saturação de E / S de disco também pode ser tratada movendo alguns espaços de tabela para outros discos. Geralmente, configuro o Oracle para que a E / S seja distribuída pelo maior número possível de discos.

EDIT: Estes são alguns casos que podem exigir instâncias separadas.

  • É sempre necessário se você executar versões diferentes do Oracle no mesmo servidor. Os aplicativos nem sempre são certificados ou capazes de trabalhar com a versão mais recente.
  • Você pode querer instâncias que podem ser revertidas automaticamente para um ponto no tempo. (Embora eu o desencoraje, usei isso para um ambiente de teste automatizado.)
  • Se você tiver referência de esquema codificada nos aplicativos, poderá precisar de instâncias diferentes para lidar com colisões de namespace.
  • Pode ser mais fácil lidar com os requisitos de segurança usando instâncias separadas. Pode ser apropriado usar servidores diferentes nesse caso.
  • A execução de versões diferentes do mesmo banco de dados (desenvolvimento, teste, aceitação do usuário, treinamento e produção) no mesmo servidor é mais segura com instâncias separadas. Eu não executaria todos esses ambientes no mesmo servidor, mas geralmente executaria dois ou mais no mesmo servidor.
BillThor
fonte
Você pode fornecer exemplos onde é necessário executar várias instâncias?
precisa saber é o seguinte
11
@ ScottCher Eu editei minha resposta para fornecer alguns casos.
BillThor
1

O recurso mais crítico é a RAM.

Cada instância do Oracle em execução aloca alguma RAM para si própria, quando é iniciada e não está carregada.

Estamos executando um 10g com 10 e 11g com 8 instâncias, mas esses são servidores de desenvolvimento. Após a reinicialização do sistema operacional, alguns dos serviços Oracle não são iniciados automaticamente e devem ser iniciados manualmente: Oradim -startup -sid xxx.

Estamos apenas começando a usar o Gerenciamento automático de memória, mas a situação permanece diferente do SQL Server, onde você pode adicionar bancos de dados tanto quanto o espaço em disco.

No seu caso, com mais instâncias em uma máquina, o SGA de cada instância fica menor, menos sql pré-compilado pode ser armazenado em cache e a máquina precisa fazer mais compilação de sql, o que reduz o desempenho.

Adicionar RAM pode ajudar na sua situação.

bernd_k
fonte
2
A razão pela qual você diz que o SQL Server é diferente é mais uma coisa de nomenclatura. Um grupo de processos e sua memória dedicada é uma instância. Se você adicionar um banco de dados do SQL Server e ele não adicionar um novo processo, não será uma instância. Nesse caso, está muito mais perto de adicionar um esquema.
Stephanie.