Configurar Instâncias Oracle com Linux HugePages

Os Sistemas Operacionais Linux possuem uma funcionalidade muito interessante chamada de HugePages, que quando usada por um banco Oracle oferece grandes ganhos de performance.

HugePages consiste em tornar os blocos de alocação de memória muito maiores do que os 4KB padrão. No Linux os HugePages possuem 2MB por padrão. Outra vantagem é que os HugePages são sempre alocados na memória física e nunca vão para a área de swap. Na verdade esses blocos de memória sequer são considerados como candidatos a ir para swap.

Configuração

A primeira coisa a ser feita para a configuração é identificar quanta quantidade de memória você necessita para ser usada como HugePages. No caso de uma instância Oracle você deve alocar uma quantidade de memória suficiente para acomodar todo o seu SGA. Para isso use a fórmula abaixo.

X = Y / Z

Onde:

X: Quantidade de HugePages necessárias
Y: Tamanho do seu SGA também em KB
Z: Tamanho do HugePage em KB

Obs.: Uma dica é sempre configurar um valor um pouco maior do informado na fórmula. Eu normalmente somo 8 no resultado encontrado.

Agora que você já sabe o número de HugePages que deve configurar, vamos colocar a mão na massa!

Configurando o Linux

O primeiro passo é editar o arquivo /etc/sysctl.conf e adicionar os seguintes parâmetros:

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 (gid) do usuário oracle utilize o comando id:

# id oracle
uid=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  8404992 oracle     hard    memlock  8404992

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
MemTotal:       264234552 kB
MemFree:        10208592 kB
Buffers:          924660 kB
Cached:         103365808 kB
SwapCached:        74752 kB
Active:         61245124 kB
Inactive:       66576684 kB
Active(anon):   56581924 kB
Inactive(anon):  5085572 kB
Active(file):    4663200 kB
Inactive(file): 61491112 kB
Unevictable:      347136 kB
Mlocked:          347136 kB
SwapTotal:      25165820 kB
SwapFree:       24892344 kB
Dirty:              4444 kB
Writeback:             0 kB
AnonPages:      24014904 kB
Mapped:         23040796 kB
Shmem:          37860316 kB
Slab:            1418188 kB
SReclaimable:     958620 kB
SUnreclaim:       459568 kB
KernelStack:       26880 kB
PageTables:      1871460 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:    97907480 kB
Committed_AS:   78301368 kB
VmallocTotal:   34359738367 kB
VmallocUsed:     1053720 kB
VmallocChunk:   34358648516 kB
HardwareCorrupted:     0 kB
HugePages_Total:   57984
HugePages_Free:     5085
HugePages_Rsvd:     5082
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:        6144 kB
DirectMap2M:     2082816 kB
DirectMap1G:    266338304 kB

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

Para validar o limite de alocação de memória 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 é necessário desabilitar o Automatic Memory Management (AMM). Esse recurso que simplifica o gerenciamento de memória da instância, ajustando automaticamente os tamanhos da SGA e da PGA, não é compatível com HugePages.

Nota: O AMM foi introduzido na versão 11g, portanto se você está configurando uma versão anterior não precisa se preocupar com ele.

Para desabilitar o AMM, basta desconfigurar os parâmetros MEMORY_TARGET e MEMORY_MAX_TARGET, e configurar o SGA_TARGET, SGA_MAX_SIZE e PGA_AGGREGATE_TARGET.

SQL> show parameter target;
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
archive_lag_target                   integer     0
db_flashback_retention_target        integer     1440
fast_start_io_target                 integer     0
fast_start_mttr_target               integer     300
memory_max_target                    big integer 0
memory_target                        big integer 0
parallel_servers_target              integer     240
pga_aggregate_target                 big integer 6G
sga_target                           big integer 24G
SQL> show parameter sga
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
lock_sga                             boolean     FALSE
pre_page_sga                         boolean     FALSE
sga_max_size                         big integer 24G
sga_target                           big integer 24G

Se estiver usando uma versão de banco anterior à 11.2.0.3, precisa ter atenção redobrada na hora de configurar a quantidade/tamanho de HugePages, pois nessas versões não existe uso parcial de HugePages. Ou seja, versões até 11.2.0.2 tentam colocar a SGA inteira em HugePages, caso a quantidade não seja suficiente, a SGA será alocada integralmente em páginas normais.

A partir da versão 11.2.0.3 passa ser possível colocar apenas parte da SGA em HugePages, e a parte que sobrar é alocada em páginas regulares. Por exemplo, caso sua SGA seja de 32GB e o número de HugePages configurado some apenas 20GB, os 12GB excedentes serão alocados em páginas regulares.

Para verificar se a instancia iniciou usando corretamente as HugePages olhe o Alert log, conforme abaixo.

Starting ORACLE instance (normal)
****************** Large Pages Information *****************
Total Shared Global Region in Large Pages = 24 GB (100%)
Large Pages used by this instance: 12289 (24 GB)
Large Pages unused system wide = 3 (6144 KB) (alloc incr 64 MB)
Large Pages configured system wide = 57984 (113 GB)
Large Page size = 2048 KB
***********************************************************

Para facilitar o controle sobre quando a instância iniciou usando corretamente as HugePages e evitar que algo errado aconteça e somente seja percebido posteriormente, quando o banco estiver apresentando problemas de performance, na versão 11.2.0.2 foi criado o parâmetro USE_LARGE_PAGES.

Esse parâmetro poder ter os seguintes valores TRUE, FALSE e ONLY.

  • FALSE a instância nunca usará as HugePages.
  • TRUE a instância tentará usar as HugePages conforme descrito acima, podendo ser afetada pela configuração incorreta do número de HugePages e alocando a SGA de forma parcial ou total em páginas regulares.
  • ONLY a instância tentará alocar toda a SGA em HugePages, caso não consiga será gerado um erro e a instância não iniciará.

O erro gerado pelo parâmetro USE_LARGE_PAGES=ONLY é o seguinte:

SQL> startup
ORA-27137: unable to allocate large pages to create a shared memory segment
Linux-x86_64 Error: 12: Cannot allocate memory

Essa situação também pode ser verificada no Alert log.

****************** Large Pages Information *****************
Parameter use_large_pages = ONLY

Large Pages unused system wide = 0 (0 KB) (alloc incr 4096 KB)
Large Pages configured system wide = 0 (0 KB)
Large Page size = 2048 KB

ERROR:
  Failed to allocate shared global region with large pages, unix errno = 12.
  Aborting Instance startup.
  ORA-27137: unable to allocate Large Pages to create a shared memory segment

ACTION:
  Total Shared Global Region size is 24 GB. Increase the number of
  unused large pages to atleast 12289 (24 GB) to allocate 100% Shared Global
  Region with Large Pages.
***********************************************************

Usando esse parâmetro, você pode ter certeza que quando a instância inicia ela está efetivamente carregada em HugePages.

Leave a Reply

Your email address will not be published. Required fields are marked *

1 + 11 =