sábado, 23 de janeiro de 2010

Linux Shared Memory - Parte 1

Uepas!!

Bom, neste exato momento (05:22) de um sábado estamos executando um procedimento de Upgrade de Oracle 9i para 10g em um SLES 9 x86_64 e dentre os requisitos para o Oracle 10g estão os tunninngs de kernel para memória compartilhada, semáforos e manipulações de arquivos.

O que vem a ser memória compartilhada?
Atualmente, nos Sistemas Operacionais já é quase improvável um sistema grande, como um Oracle, SAP, Postfix e outros, trabalhar com apenas 1 processo. Usa vários processos torna tudo mais rápido pois diversos processos podem trabalhar em conjunto fazerndo diversas ações diferentes ou atendendo múltiplus clientes ao mesmo tempo.

Porém, quando uma aplicação usa multi-processos esses sempre chegarão em um ponto em comum. Em um banco de dados, por exemplo, existe apenas uma database e vários processos que precisam usá-la. Para garantir a integridade, os processos devem usá-la sequencialmente e de forma civilizada. Nosso fabuloso kernel faz esse serviço deslumbrante permitindo que apenas um processo use determinada informação por vez.

Agora imagine um sistema com 200 processos precisando manipular uma única informação. Em um ambiente sem memória compartilhada o kernel precisaria copiar toda a informação para a área de memória do processo que estava na vez, depois copiar novamente para o outro e assim por diante. Nossa!! Até para escrever isso já fica mais demorado : ), imagina um usuário cliquemaníaco esperando que seu processo seja concluído!!

Para evitar esse problema e dar uma velocidade realmente boa para essa briga desenfreada por manipulação de uma única informação, os processo usam memória compartilhada. Isso significa que a informação em comum para todos os processos ficará em uma área de memória acessível por todos eles. A diferença nessa ambiente é que o kernel precisará apenas controlar que processo terá acesso e não mais fazer a cópia da informação para a memória privada de cada processo. Felizmente isso existe e é muito usado.

Ah! O nome desse compartilhamento de informações entre processos chama-se Interprocess Communication (IPC). Por coincidência temos um comando chamado "ipcs" no Linux. : )

Ok! Agora que entendemos o que é memória compartilhada podemos seguir com o tunning de Kernel no Linux.

Como verifico os parametros atuais?
Através do diretório /proc, onde estão todos os arquivos de configuração que interagem diretamente com kernel e SO.
Ex: $ cat /proc/sys/kernel/shmmax

Outra forma de verificar essas opções é através do comando: $ sysctl -a
Esse comando vai listar todas as configurações do /proc. Daí é só fazer um fltro na saída.

Parâmetros de Memmória Compartilhada

Bom, falando em memória compartilhada em Linux temos as seguintes configurações principais:
SHM = Abreviatura de Shared Memory

SHMMAX
Esse parâmentro diz qual será o tamanho máximo de um bloco de memória compartilhada que poderá ser alocado por processo. Não existe uma receita de bolo para isso. Tudo vai depender do que você vai rodar nesse servidor. Na maioria dos casos esse parâmetro serve para todos os aplicativos do servidor, mas no caso do Oracle, por exemplo, podemos querer configurá-lo para um maior desempenho aumentando seu SGA (System Global Área) para 5 GB.

OBS.: Esses valores estou inventando agora apenas para explicar sobre o shmmax.

Nesse caso significa que precisaremos configurar nosso shmmax para um valor que seja, no mínimo, 5 GB.
Lembrando que o shmmax é sempre configurado em bytes.
Caso eu tenha uma aplicação que precise de um bloco de memória compartilhada maior do que está especificado no SHMMAX, as probabilidades dessa aplicação dar "zica" são bem grandes.

Exemplo de erro no Oracle decorrente disso:
ORA-27123: unable to attach to shared memory segment
Para verificarmos informações de memória compartilhada no nosso sitema podemos usar o seguinte comando:
$ ipcs -lm

DICA: Sempre que precisar alterar esses valores utilize o arquivo /etc/sysctl.conf.


Depois de pesquisar bastante e fazer alguns testes cheguei em uma "regra" para definirmos o valor mais adequado para shmmax. Devemos descobrir os tamanhos dos blocos utilizados pelas aplicações como SGA, PGA, etc. Os administradores de tais aplicações devem trabalhar em conjunto para isso.
Uma vez definidos os tamanhos de blocos usados pelas aplicações somamos todos eles e acrescentamos 25% para processos do Sistema Operacional (Gerenciamento). Ex: SGA=5G, PGA=2G. (5+2)+25% = 8.75G. Podemos até arredondar para 9G que está tranquilo.

Importante: Em estruturas 32 Bits procure evitar valores próximos ou maiores de 4G. Pois nesses casos o sistema usará swap/paginação e o tunning pode acabar andando na contra-mão.

Extra
Não existe limite para o valor de shmmax, porém alguns pontos devem ser considerados.
1 - Caso configure ele para um valor acima da memória total resultará em Swap e perda de desempenho. É, no mínimo, uma loucura!!
2 - Caso configure ele para um valor acima da memória disponível (sobrando) resultará em Swap e perda de desempenho caso as aplicações usem todo esse tamanho. É para quem gosta de emoção!!
Nesse caso seu sistema funcionará corretamente se as aplicações estiverem funcinando abaixo desse valor, mas qualquer alteração no comportamento dessas aplicações poderá afetar o sistema.
3 - Em alguns forum reportaram que foi feita uma instalação do Oracle com esse valor bem alto e depois baixada. Quando precisaram de suporte a Oracle se negou a continuar até que o valor voltasse para o valor inicial
http://forums11.itrc.hp.com/service/forums/questionanswer.do?admit=109447626+1264240898189+28353475&threadId=811971

Por via das dúvidas, ajuste esse valor de acordo com as necessidades e depois vá aumentando caso necessário.

Como ficou grande esse post continuarei em outro...

Nenhum comentário:

Postar um comentário