Páginas

segunda-feira, 24 de março de 2014

Configurar HugePages no Linux

Otimizando memória no Linux com HugePages

Olá a todos,

No artigo de hoje vou comentar sobre um recurso chamado HugePages. Para grandes tamanhos de SGA, HugePages poderá trazer benefícios substanciais na gestão de memória virtual. 

A memória no Linux é dividida em páginas de 4K, mas usando HugePages, o tamanho da página é aumentado para 2 MB, reduzindo o número total de páginas a serem gerenciados pelo Kernel e, consequentemente, reduzindo a quantidade de memória necessária para manter a tabela de páginas na memória. Percebam a conta: 2MB é 512 vezes maior do que o tamanho padrão de 4 KB.

O fato de ter páginas de dados bem maiores permite que mais dados sejam alocados na mesma unidade de armazenamento lógico e que menos páginas de dados sejam criadas e gerenciadas pelo SO, portanto, é exatamente isso que permite reduzir o uso de CPU e melhorar a performance das pesquisas de dados em buffer (Translation Lookaside Buffer).

Além dessas mudanças, a memória associada a hugepages não sofre swap, o que obriga o SGA a ficar residente na memória física. A economia de memória e do esforço de gestão de páginas fazem com que HugePages seja praticamente obrigatório para sistemas Oracle 11g rodando em x86-64.

Só porque teremos uma SGA grande, não significa automaticamente que teremos problemas se não usar HugePages. É uma combinação entre uma SGA grande e com grandes quantidades de conexões que leva ao problema. Para determinar a quantidade de memória que você está usando, para apoiar a tabela de páginas, execute o seguinte comando em um momento em que o servidor está sob carga normal/pesado:
# grep PageTables /proc/meminfo
PageTables:      1427048 kB

Em 2012, ao migrar os Bancos de Dados Oracle da empresa em que trabalho da versão 10G, para um novo servidor, com a versão 11G, eu já aproveitei e habilitei HugePages. Não consegui medir o ganho de performance porque eu não fiz isso de forma isolada, porém ao efetuar algumas pesquisas na Internet, encontrei um artigo aonde ele demonstra ter conseguido obter um ganho de 6% no I/O Lógico (LIO) ao habilitar HugePages em uma instância Oracle com 60 GB de SGA, executando queries em pequenas tabelas.

Nota: O Automatic Memory Management (AMM) não é compatível com HugePages. Se você quer habilitar HugePages, você tem que usar Automatic Shared Memory Management (ASMM).

Para configurar HugePages no SO e permitir que a SGA do seu BD Oracle utilize este recurso, siga o roteiro oficial da Oracle, conforme instruções do link Configuring HugePages on Linux.


Configurando o Linux
A primeira coisa a ser feita é identificar quanta quantidade de memória você precisa para ser usada como HugePages. No caso de uma instância Oracle deveremos alocar todo o SGA. A quantidade de HugePages necessária será igual ao tamanho do SGA em KB dividido pelo tamanho do HugePage em KB (2048).

O script abaixo ajuda a calcular a quantidade de páginas necessárias:
#!/bin/bash
#
# hugepages_settings.sh
#
# Linux bash script to compute values for the
# recommended HugePages/HugeTLB configuration
#
# Note: This script does calculation for all shared memory
# segments available when the script is run, no matter it
# is an Oracle RDBMS shared memory segment or not.
# Check for the kernel version
KERN=`uname -r | awk -F. '{ printf("%d.%d\n",$1,$2); }'`
# Find out the HugePage size
HPG_SZ=`grep Hugepagesize /proc/meminfo | awk {'print $2'}`
# Start from 1 pages to be on the safe side and guarantee 1 free HugePage
NUM_PG=1
# Cumulative number of pages required to handle the running shared memory segments
for SEG_BYTES in `ipcs -m | awk {'print $5'} | grep "[0-9][0-9]*"`
do
   MIN_PG=`echo "$SEG_BYTES/($HPG_SZ*1024)" | bc -q`
   if [ $MIN_PG -gt 0 ]; then
      NUM_PG=`echo "$NUM_PG+$MIN_PG+1" | bc -q`
   fi
done
# Finish with results
case $KERN in
   '2.4') HUGETLB_POOL=`echo "$NUM_PG*$HPG_SZ/1024" | bc -q`;
          echo "Recommended setting: vm.hugetlb_pool = $HUGETLB_POOL" ;;
   '2.6' | '3.8') echo "Recommended setting: vm.nr_hugepages = $NUM_PG" ;;
    *) echo "Unrecognized kernel version $KERN. Exiting." ;;
esac
# End


Executando o script acima deve retornar algo como:

# ./hugepages_settings.shRecommended setting: vm.nr_hugepages = 3851
#

Devemos editar o arquivo /etc/sysctl.conf e adicionar os parametros:vm.nr_hugepages=<Número de HugePages>vm.hugetlb_shm_group=<ID do grupo principal do usuário oracle>

Para verificar o ID do grupo principal do usuário oracle utilize o comando id:

# id
id oracleuid=500(oracle)gid=501(oinstall) groups=501(oinstall,500(dba)
#
No exemplo acima o ID é 501.

O passo seguinte é editar o arquivo /etc/security/limits.conf e definir a quantidade máxima de memória que o usuário oracle pode alocar:

oracle    soft   memlock   68157440
oracle   soft   memlock   68157440

O valor deve ser informado em KB e ser maior que o SGA.

Depois de configurar esses parâmetros reinicie o S.O. para que as configurações entrem em vigor.

Para validar use os seguintes comandos:
# cat /proc/meminfo
......
HugePages_Total: 21800
HugePages_Free:    968
HugePages_Rsvd:    929
Hugepagesize:     2048 kB



Verifique se o item de HugePages_Total está com o valor configurado.

Para validar o limite de alocação de memoria do usuário oracle, logue-se com ele e use o comando abaixo:

# ulimit -l


Verifique se o valor retornado é igual ao configurado.

Agora basta configurar o Oracle.



Configurando o Oracle

No Oracle o que deve ser feito é desabilitar o gerenciamento automático de memória (AMM).

Essa configuração não é requerida na versão 10g, apenas na 11g. Mas é recomendado que seja aplicada em ambos pois o ganho de performance pode ser significativo. Isso ocorre pois o gerenciamento automático de memória pode, em algumas situações, consumir muitos recursos e causar problemas de performance, dessa forma a recomendação geral é que utilize tamanhos pre-definidos para os pools no SGA.

Para desabilitar o AMM basta configurar o parâmetro SGA_TARGET para "0" com o seguinte comando:

SQL> alter system set sga_target=0;



Após isso será necessário reiniciar a instância para aplicar a configuração, pois trata-se de um parâmetro estático.

SQL> shutdown immediate...SQL> startup

Para saber se o Oracle iniciou utilizando as páginas em HugePages utilize novamente o comando "cat /proc/meminfo" e verifique a diferença entre os valores dos itens HugePages_Total e HugePages_Free. Se o valor de free for menor que o de total a sua instância está utilizando os HugePages, caso contrário, valide novamente as configurações e reinicie novamente a instância Oracle. Configure o arquivo init ou spfile para configurar o SGA_TARGET, dependendo da configuração do seu ambiente.


Bom trabalho e boa sorte à todos.

Nenhum comentário:

Postar um comentário