sábado, 23 de janeiro de 2010

Linux Shared Memory - Parte 2

Continuando...

SHMMNI

Esse parâmetro serve para definirmos o número máximo de segmentos de memória para todo o sistema, ou seja, quantas bloquinhos de memória compartilhada ele vai poder criar.

Esse parâmentro é bem tranquilo. Seria problema apenas se o valor dele mutiplicado pelo shmmax ultrapassasse o tamanho de memória disponível no sistema, passando a usar Swap e degradando a performance do sistema. Mas embora isso seja possível, nunca vi acontecer. Por outro lado se tiver um valor muito baixo pode ocorrer de alguma aplicação tentar criar um segmento e não conseguir acarretando uma corrupção de dados, travamento, etc.

Minha dica para a correta configuração desse parâmetro é definir um valor que multiplicado por SHMMAX fique um pouco (uns 25%) abaixo da memória total.

Algumas aplicações, como o Oracle 10g, já tráz em suas documentações o valores mínimos necessários na configuração... Mas não precisa ser levado à risca pois eles sempre chutam bem alto e raramente será usado o valor indicado por eles. O ideal é sempre adequar as proporções do servidor e da aplicação.

O que ocorre muito comunmente é colocarem valores enormes para "garantir" que nunca falte. Na minha opinião isso pode ser feito tranquilamente, mas quando não existe conhecimento para deixar com a configuração ideal.

A falta de conhecimento sempre gera medo!! Quer um exemplo? Já viu algum bastardo dar permissão 777 em um arquivo sem nem saber se o problema é permissão e ainda virar e falar: "É só para garantir! Depois eu arrumo!!" hehe Isso ali nunca mais vai ser arrumado.
O que me deixa feliz quanto à isso é que certamente esse administrador vai deixar um furo cedo ou tarde pela sua imprudência. E nesse caso eu poderei dar consultoria para ele e ganhar dinheiro. hehehe
Bom! Empolguei.

Ah, outro tópico importante nesse shmmni é que dificilmente os segmentos terão o tamanho de shmmax. Normalmente são bem menores.


SHMALL

Bom, o shmall define o tamanho máximo reservado para compartilhamento de memória em paginação do sistema. Ao contrário dos outros parâmentros ele é definido em página e não em bytes. Seu valor é bem relacionado com o shmmax, inclusive na maioria dos lugares que pesquisei o pessoal coloca como regra para seu valor a seguinte fórmula SHMMAX/PAGE_SIZE.

Isso não está errado, mas também não deve ser dito como um regra. A impressão que tenho é que as grandes empresas criam um padrão que acreditam agradar todos levando em consideração que nenhum administrador terá conhecimento para definir do seu próprio jeito. Depois esses adminsitradores lêem essa documentação e acreditam cegamente nela. O suporte técnico da ferramenta e qualquer outro administrador que não se interessa em pesquisar e estudar vão fazer a mesma coisa. Pronto!! Virou regra! Daí quando vem um louco que estudou sobre o assunto e disse aquele não é o valor mais adequado e todos tem a audácia de falar "Mas a documentação oficial manda fazer assim...!!". E assim termina a justificativa. Digo isso pois já passei por casos como esse com consultores SAP... Mas isso não interessa agora!! Putz, empolguei-me novamente. : )

Voltando ao que interessa... Essa dica para dividir o shmmax pelo valor de paginação funciona e é bem interessante. Um arquivo de paginação sempre tem um tamanho fixo e definido. As memórias compartilhadas serão formadas por arquivos de paginação. Logo o total de paginação não poderia ser maior que shmmax. Mas isso considerando apenas uma instância do oracle, por exemplo.

Tentarei ser mais claro. Seguindo as dicas que coloquei no post do shmmax, faremos um cálculo do que os SGAs, PGAs e SOs usarão de memória compartilhada no total. Feito isso temos o máximo de memória compartilhada que nosso servidor pode usar. Legal.
Agora vamos definir o shmall, que na mairia das distros é em páginas e não em bytes. Esse kra vai dizer qual o tamanho máximo de memória compartilhada em arquivos de paginação. Sabendo que nosso sistema tem páginas de tamanho 4096 bytes através do comando $ getconf PAGE_SIZE e que o tamanho máximo de memória compartilhada é igual a shmmax basta dividirmos SHMMAX por 4096 e fica legal.

Pronto! Explicada a regra milagrosa que quase todo mundo usa. Mas eis o ponto que quero chegar... O que eu faço com esses parâmentros se eu quiser uma segunda insttância do oracle com mesmo tamanho de SGA? hehe.
Ta bom! Vamos usar exemplos concretos. Tenho um SGA de 5G e PGA de 2G. Somo os dois e acrescento 25%. Isso daria 8.75G. Arredondei para 9G para ficar melhor já que isso não causa impacto. Transformo em bytes e tenho o shmmax de 9663676416. O tamanho do meu arquivos de paginação é de 4096 bytes.
Logo shmall é 9663676416 / 4096 = 2359296.

Agora se eu quiser colocar mais uma instância desse oracle exatamente igual, meu shmmax não mudará, pois a instância é igual. O que precisa ser mudado é o total de memória compartilhada para todo o sistema. Sendo um pouco menos burocrático podemos simplesmente consideram que teremos dois kras usando o valor de shmmax. Logo shmall = 9663676416 / 4096 = 2359296 * 2 = 4718592.

Espero que agora tenha ficado mais claro, pois eu perdi um tempo procurando documentação para entender isso. Pelo menos agora está documentado de forma clara (espero!!).



SHMMIN

Esse é o oposto do SHMMAX e significa o tamanho mínimo possível de um segmento de memória compartilhada. O padrão desse parâmentro já é 1 em quase todas as distros e outras nem mesmo o trazer disponível para alterações.

Pesquisei um monte e não encontrei nem consegui imaginar uma razão para deixar esse kra maior que 1. Talvez até tenha algum motivo que eu não conheça, mas por enquanto acho que é a mesma coisa que procurar chifre em cabeça de cavalo, ou seja, não vai melhorar em nada e ainda pode causar algum problema.

Aqui finalizo os posts sobre Linux Shared Memory. Acho que postarei alguns sobre semáforos qualquer hora dessas.

Abração!

Nenhum comentário:

Postar um comentário