Memória compartilhada
Assim: Memória compartilhada como o nome mesmo diz, é o local de memória onde ela pode ser compartilhada entre diferentes processos. O oracle utiliza essa area de memoria para a implementar a SGA (System Global Area), da qual precisa estar visivel para todas as sessoes de banco de dados. Por isso as vezes o administrador apesar de ter memória disponivel nao consegue alocar uma SGA maior, necessita configurar os parametros de memoria para que a SGA vá até estes limites impostos pelo sistema operacional.
Um erro comum por exemplo no banco postgree por falta de memroia compartilhada é:
Out of Memory: Killed process 12345 (postmaster).
A partir do kernel 2.6, opadrão é que não haja "sobre-utilização". Caso esteja desativado, pode ser implementado selecionando um modo restrito de sobre-utilização através do sysctl:
[root]# sysctl -w vm.overcommit_memory=2
Aproveitando o espaço, e como estava com as definições em mãos, segue descritivo referencia para facilitar a configuração (quando necessário) desses parâmetros:
SHMMAX
Tamanho máximo de um segmento de memória compartilhada (bytes). 250 kB + 8.2 kB * shared_buffers + 14.2 kB * max_connections até o infinito.
SHMMIN
Tamanho mínimo de um segmento de memória compartilhada (bytes). Padrão 1.
SHMALL
Quantidade total de memória compartilhada disponível (bytes ou páginas)
SHMSEG
Número máximo de segmentos de memória compartilhada por processo. Somente 1 segmento é necessário, mas o padrão é muito maior.
SHMMNI
Número máximo de segmentos de memória compartilhada para todo o sistema.
Semáforos
Os semáforos sao sinais que podem estar ligados ou desligados indicando que este processo ainda nao finalizou sua tarefa. Veja, os semaforos existem para que nao sejam sobrepostas as operações executadas pelos processos. Imagina a copia em paralelo de um arquivo do arquivo do word se os dois ao mesmo tempo serem gravados no mesmo local com mesmo nome o que ocorrerá ? Existe ai um conflito para utilizacao do nome do arquivo, do espaço em disco, portanto um semaforo resolveria essa questao sinalizando um processo para que ele aguarde ate que o outro termine a sua operação. Um processo pode ter uma sinalização de ligado ou desligado, isso na verdade servirá como uma forma de controle de eventos e processos para que a SGA do Oracle consiga controlar toda a concorrencia de escrita e leitura na memoria compartilhada.
Verificação de instalação:
Inicie sua jornada usando o comando abaixo:
[root]# ipcs -la
----- Limites da memória compartilhada ----------
número máximo de segmentos: 4096
tamanho máximo do segmento (Kb): 2097152
memória compartilhada total máxima (Kb): 8388608
tamanho mínimo do segmento (bytes): 1
------ Limites de semáforo ----------------------
número máximo de arrays: 100
máximo de semáforos por array: 100
máximo geral de semáforos do sistema: 32000
máximo de ops por chamada semop: 100
valor máximo de semáforo: 32767
------ Mensagens: limites -----------------------
número máximo geral de filas no sistema: 16
tamanho máximo da mensagem (bytes): 8192
tamanho máximo padrão da fila (bytes): 16384
Para o Oracle 10G, estes valores podem variar de acordo com release e versão:
echo 100 32000 100 100 > /proc/sys/kernel/sem
Depois confirme com o comando cat:
cat /proc/sys/kernel/sem
Precisamos também aumentar o numero máximo de arquivos manipulados pelo usuário, para 131072:
echo 131072 > /proc/sys/fs/file-max
ulimit -n 131072
Aumentar as portas disponiveis no servidor:
echo 1024 65000 > /prco/sys/net/ipv4/ip_local_port_range
Aumentar o numero máximo de processos que podem ser controlados pelo usuario, para 16384.
com o ulimit -a voce consegue verificar como o seu sistema esta atualmente.
ulimit -u 16384
Alterar diretamente no parametro do kernel, veja essa mudanca nao é permanente.
echo 65536 > /proc/sys/fs/file-max
Essa agora sim, a cada boot é lido novamente o arquivo sysctl.conf, se quiser confira os demais parametros editando o arquivo sysctl.conf com o vi.
echo fs.file-max=65536 >> /etc/sysctl.conf
E depois o numero de processos controlados pelo usuario oracle no servidor.
Eu aconselho colocar esse comando no profile comum que fica em /etc/profile.sh ou no bash_profile do usuario. Outra dica é colocar no arquivo /etc/security/limits.conf
ficando assim:
oracle soft nofile 63536
oracle hard nofile 63536
Duas dicas interessantes:
NOTE: It is also possible to query the current usage of file handles using the following command:
# cat /proc/sys/fs/file-nr
1140 0 103062
In the above example output, here is an explanation of the three values from the file-nr command:
* Total number of allocated file handles.
* Total number of file handles currently being used.
* Maximum number of file handles that can be allocated. This is essentially the value of file-max - (see above).
NOTE: If you need to increase the value in /proc/sys/fs/file-max, then make sure that the ulimit is set properly. Usually for 2.4.20 it is set to unlimited. Verify the ulimit setting my issuing the ulimit command:
# ulimit
unlimited
Lembre-se o comportamento tanto da manipulação dos arquivos quanto dos processos pode ser diferente quanto ao metodo de login, portanto SSH, login via terminal poderão ter limites diferentes.
Confirme tudo com o comando
sysctl -p
ou ainda para confirmar os arquivos separadamente, ou seja nao precisa de boot:
sysctl -w fs.file-max=65536
Bom, de tudo eu li a informação no site do puschitz também, mas ta confuso visto que ele mexe no mesmo parametro duas vezes no mesmo arquivo /etc/security/limits.conf tanto para o numero de processos quanto para o numero de arquivos.
Veja em http://www.puschitz.com/TuningLinuxForOracle.shtml
Resumo - Execute os comandos como root:
echo "kernel.sem=250 32000 100 128" >> /etc/sysctl.conf
Comentários