Para melhor visualização, recomendo resolução de no mínimo 1280 x 800 e navegador Mozilla Firefox


quarta-feira, 1 de junho de 2016

Um pouco sobre o Database Resource Manager (Instance Caging) do Oracle 11g R2

Por Eduardo Legatti

Olá,

Em um servidor onde existem várias instâncias de bancos de dados Oracle, em alguns momentos pode acontecer do mesmo ficar muito sobrecarregado e com o "load" alto pelo fato de uma ou mais instâncias do Oracle estarem consumindo muitos recursos de CPU. Neste caso, uma instância pode comprometer a performance geral do servidor e impactar o funcionamento das demais instâncias. Então, como fazer para que possamos restringir quanto uma instância poderá consumir de CPU nesse servidor? A partir do Oracle 11g R2 é possível limitar o uso de CPU em um servidor com múltiplos núcleos (CPU core). Para isso faremos uso de uma feature chamada Instance Caging do Database Resource Manager. Segue um exemplo prático.

Abaixo está sendo mostrado a saída do comando TOP do Linux de um servidor que possui 8 núcleos de CPU e cerca de 15 instâncias Oracle.

top - 10:00:05 up 526 days, 18 min,  1 user,  load average: 7.28, 4.59, 4.78
Tasks: 1125 total,   6 running, 1102 sleeping,  16 stopped,   1 zombie
Cpu0  : 47.6%us,  3.9%sy,  0.0%ni, 44.7%id,  3.9%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu1  : 85.4%us,  0.0%sy,  0.0%ni, 13.6%id,  0.0%wa,  0.0%hi,  1.0%si,  0.0%st
Cpu2  : 34.3%us,  2.0%sy,  0.0%ni, 63.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu3  : 48.1%us,  1.0%sy,  0.0%ni, 49.0%id,  0.0%wa,  1.0%hi,  1.0%si,  0.0%st
Cpu4  : 47.1%us,  3.8%sy,  0.0%ni, 45.2%id,  2.9%wa,  0.0%hi,  1.0%si,  0.0%st
Cpu5  : 33.7%us,  5.9%sy,  0.0%ni, 59.4%id,  0.0%wa,  0.0%hi,  1.0%si,  0.0%st
Cpu6  : 43.3%us,  5.8%sy,  0.0%ni, 50.0%id,  1.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu7  :100.0%us,  0.0%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:  32876004k total, 32439108k used,   436896k free,   102568k buffers
Swap: 16777208k total,  6779068k used,  9998140k free, 23822240k cached

Agora irei realizar um teste na qual habilitarei o Instance Caging na instância BD01 de forma a limitar o consumo de CPU pela mesma. Para isso farei alteraçao em 2 parâmetros dinâmicos no Oracle (CPU_COUNT e RESOURCE_MANAGER_PLAN). O propósito será limitar a instância BD01 de consumir no máximo 4 núcleos de CPU conforme demonstrado abaixo.

$ export ORACLE_SID=BD01
$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.1.0 Production on Qua Jun 1 09:58:32 2016

Copyright (c) 1982, 2010, Oracle.  All rights reserved.

Conectado a:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> alter system set CPU_COUNT = 4;

Sistema alterado.


Após limitar para 4 o número de núcleos de CPU que a instância BD01 poderá usar, irei habilitar de fato o Instance Caging setando o parâmetro RESOURCE_MANAGER_PLAN com o valor DEFAULT_PLAN conforme demonstrado abaixo.

SQL> alter system set RESOURCE_MANAGER_PLAN = DEFAULT_PLAN;

Sistema alterado.
 
Pronto. A partir de agora o Instance Caging está habilitado para a instância BD01 de forma que a mesma se limite ao consumo de apenas 4 núcleos do total de 8 existentes no servidor.

SQL> show parameter CPU_COUNT;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
cpu_count                            integer     4

SQL> show parameter RESOURCE_MANAGER_PLAN;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
resource_manager_plan                string      DEFAULT_PLAN
 
Abaixo podemos ver que o plano DEFAULT_PLAN está habilitado.

SQL> select id,name,is_top_plan,cpu_managed,instance_caging from v$rsrc_plan;

        ID NAME                         IS_TOP_PLAN CPU_MANAGED INSTANCE_CAGING
---------- ---------------------------- ----------- ----------- ---------------
    125274 DEFAULT_PLAN                 TRUE        ON          ON
    125271 ORA$AUTOTASK_SUB_PLAN        FALSE       ON          ON
    125272 ORA$AUTOTASK_HIGH_SUB_PLAN   FALSE       ON          ON

3 linhas selecionadas.

Realizando um pequeno teste e abrindo 4 sessões no Oracle através do SQL*Plus, executei algumas instruções SQL pesadas na instância BD01. Pela saída do comando TOP abaixo podemos perceber que apenas 4 núcleos de CPU estão em uso com quase 100% cada, ou seja, dando um total de 400% de uso.

top - 10:03:05 up 526 days, 20 min,  1 user,  load average: 4.32, 6.88, 5.21
Tasks:   4 total,   4 running,   0 sleeping,   0 stopped,   0 zombie
Cpu(s): 73.6%us,  2.1%sy,  0.0%ni, 24.2%id,  0.1%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:  32876004k total, 32369496k used,   506508k free,    97944k buffers
Swap: 16777208k total,  8340916k used,  8436292k free, 23379872k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 5025 oracle    20   0  932m  24m  20m R 98.9  0.1   4:21.60 oracleBD01 (LOCAL=NO)
 5041 oracle    20   0  932m  24m  20m R 98.9  0.1   4:17.72 oracleBD01 (LOCAL=NO)
 7737 oracle    20   0  932m  22m  20m R 98.9  0.1   3:45.09 oracleBD01 (LOCAL=NO)
 5001 oracle    20   0  933m  28m  25m R 98.9  0.1   4:24.05 oracleBD01 (LOCAL=NO)

Agora irei limitar ainda mais o consumo de CPU para a instância BD01 de forma que a mesma utilize apenas 1 núcleo de CPU.


SQL> alter system set CPU_COUNT = 1;

top - 10:06:17 up 504 days, 22 min,  1 user,  load average: 3.13, 5.38, 3.85
Tasks:   4 total,   1 running,   3 sleeping,   0 stopped,   0 zombie
Cpu(s): 54.4%us,  3.3%sy,  0.0%ni, 35.9%id,  5.7%wa,  0.0%hi,  0.8%si,  0.0%st
Mem:  32876004k total, 32543176k used,   332828k free,   109064k buffers
Swap: 16777208k total,  8330556k used,  8446652k free, 23567276k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 7737 oracle    20   0  932m  24m  20m R 35.9  0.1  10:40.08 oracleBD01 (LOCAL=NO)
 5041 oracle    20   0  932m  24m  20m S 25.4  0.1  10:42.45 oracleBD01 (LOCAL=NO)
 5001 oracle    20   0  933m  28m  25m S 19.6  0.1  10:47.46 oracleBD01 (LOCAL=NO)
 5025 oracle    20   0  932m  24m  20m S 18.5  0.1  10:44.54 oracleBD01 (LOCAL=NO) 
 
Podemos perceber pela saída do comando TOP acima que ocorreu um balanceamento de carga de CPU entre as sessões de forma que no máximo apenas 100% , ou seja, como se apenas 1 núcleo fosse utilizado pelas 4 sessões. Pode-se notar também que após essa limitação é possível perceber que o "load" do servidor diminuiu de 4.32 para 3.13.

No mais, vale a pena salientar que a limitação de CPU ocorre para processos de primeiro plano (foreground processes) e alguns processos de segundo plano não críticos (background processes).



Nenhum comentário:

Postagens populares