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:
Postar um comentário