Semaphores

O que são Semaphores no UNIX?
Porque são importantes?
Qual o padrão para o oracle?
Porque para instalar o oracle é necessário essas mudanças?

Você tem algumas dessas duvidas? então vamos tentar resolve-las.


Quando você pensa em Semaphores você logo pensa em uma sinaleira de transito, devido a palavra ser bem parecida com a palavra em inglês, e você não esta errado não.
Semaphores, são na realidade semáforos de transito onde sinaliza quem pode ou não prosseguir, a unica diferença seria o alerta, que não existe, ou pode prosseguir ou não.
Logo Pensamos em “0 e 1”, “ligado e desligado”.
Quando algum recurso do sistema operacional se extingue o semáforo sinaliza 1 até que o recurso libere e assim funciona para todos os casos do SO.
E é por isso que você terá de aumentar manualmente esses valores, para liberar mais recursos ao sistema operacional.
Em uma instalação Oracle em Unix rapidamente você consome muitos semáforos, e devido a isso você terá de aumentar os padrões basicos para seu Oracle funcionar normalmente.

Padrões Basicos para Oracle 11G
fs.aio-max-nr=1048576
fs.file-max=6815744
kernel.shmall=2097152
kernel.shmmni=4096
kernel.shmmax=2147483648
kernel.sem=250 32000 100 128
net.ipv4.ip_local_port_range=9000 65500
net.core.rmem_default=262144
net.core.rmem_max=4194304
net.core.wmem_default=262144
net.core.wmem_max=1048586

Você terá acesso a todos os semáforos com o programa “sysctl -a”

Porem para o oracle apenas alguns são relevantes, Segue abaixo uma breve descrição de cada.

fs.aio-max-nr é o valor maximo de requisições de IO concorrentes permitidas. O valor padrão é 64Kb é reacionado ao asynchronous I/O

fs.file-max é o valor total de arquivos que o Kernel do linux deverá suportar em paralelo

kernel.shmall Total de memória em que o Oracle poderá utilizar
Caso sua instancia for utilizar 10G de memória você deverá ajustar este parametro para tal, conforme abaixo.
kernel.shmall=Total da SGA (em bytes)/PAGE_SIZE (em bytes)
kernel.shmall=10*1024*1024/4096
Caso você tenha mais de uma instancia no seu servidor este valor total de SGA deverá ser somado entre todas as instancias.
Exemplo duas instancias de 7G cada
kernel.shmall=14*1024*1024/4096

kernel.shmmni é o numero maximo de segmentos de memória compartilhada.

kernel.shmmax é o tamanho maximo de memória compartilhada Formula (250kB + (8,2KB * shared_buffers) + (14,2KB * max_connections))

kernel.sem dividido em quatro colunas “semmsl semmns semmap semmni”
SEMMSL Número máximo de semáforos por array.
SEMMNS Número máximo de semáforos para todo o sistema.
SEMMAP Número de entradas no mapa de semáforos. Formula(SEMMAP = SEMMNI * SEMMSL).
SEMMNI Número máximo de identificadores de semáforos (array).

Você poderá Verificar qual o limite de seu SO com o comando “ipcs -la” abaixo de “Semaphore Limits”

[root@Testes ~]# ipcs -la

------ Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 524288
max total shared memory (kbytes) = 8388608
min seg size (bytes) = 1

------ Semaphore Limits --------
max number of arrays = 128
max semaphores per array = 250
max semaphores system wide = 32000
max ops per semop call = 100
semaphore max value = 32767

------ Messages: Limits --------
max queues system wide = 1500
max size of message (bytes) = 8192
default max size of queue (bytes) = 16384

Semáforos para tunning de rede.
net.core.rmem_default Tamanho do buffer de recepção padrão para todas as conexões.
net.core.rmem_max Tamanho do buffer de recepção maximo para todas as conexões.
net.core.wmem_default Tamanho do buffer de envio padrão para todas as conexões.
net.core.wmem_max Tamanho do buffer de envio maximo para todas as conexões.

Alguns problemas.

Mesmo você setando o padrão Oracle para todos os parametros você poderá receber alguns erros nesses parametros após a instalação do oracle.
E devido a isso é interessante você conhecer a fundo pelo menos os principais parâmetros relacionado a memória.
Quem aqui nunca instalou um banco com pelo menos 10G de memória? Isso ocorreria problemas caso você manter 10G você terá de ajustar o parametro “kernel.shmall”conforme a necessidade.

Hoje com o avanço dos softwares da Oracle a mesma já efetua a correção na hora da instalação para seu ambiente, porem em um caso de tunning é interessante você saber que esses parametros podem ser um empecilho em uma possivel mudança.

Existem varias maneiras de alterar estes parâmetros
Particularmente utilizo a famosa tecnica do “echo”

“echo “kernel.sem=250 32000 100 128″ >> /etc/sysctl.conf”
depois efetuando o comando “sysctl -p” para dar um reload no arquivo de configuração.

Mas você também pode efetuar a mudança pelo próprio “sysctl” com a opção -w

sysctl -w kernel.sem=”250 32000 100 128″

Observe:

[root@Testes ~]# cat /etc/sysctl.conf |grep kernel.sem
kernel.sem =   100
[root@Testes ~]# echo "kernel.sem=250 32000 100 128" >> /etc/sysctl.conf
[root@Testes ~]# cat /etc/sysctl.conf |grep kernel.sem
kernel.sem =   100
kernel.sem=250 32000 100 128
[root@Testes ~]# sysctl -w kernel.sem="250 32000 100 128"
kernel.sem = 250 32000 100 128
[root@Testes ~]# cat /etc/sysctl.conf |grep kernel.sem
kernel.sem =   100
kernel.sem=250 32000 100 128
[root@Testes ~]# sysctl -p

Qualquer duvida questione nos comentários.

Espero ter ajudado.

Referencias:
http://johanlouwers.blogspot.com.br/2010/02/aio-max-nr-parameter-for-oracle.html
http://www.mjmwired.net/kernel/Documentation/sysctl/fs.txt
http://casadodba.wordpress.com/2011/10/01/o-parametro-kernel-shmall/
http://wwwx.cs.unc.edu/~sparkst/howto/network_tuning.php

%name Semaphores

Autor: Leandro Lana

Trabalho com banco de dados Oracle desde 2006, já trabalhei com as plataformas 9i, 10G, 11G e 12C.

Trabalhando atualmente como consultor Oracle na MigraTI Soluções em TI como administrador de banco de dados Oracle, SQL-Server e DB2.

Contato: leandro.lana@migrati.com.br

Fone: (47) 9191-6052 / (47) 3328 0996

Certificações:

OCA 10G.

OCP 10G.

OCE Linux.

OCE RAC/Cluster.

MCP SQL-Server 2008.

MCITP SQL-Server 2008.

DB2 Fundamentals.