Thursday, July 22, 2010

Oracle on Linux - Load average factor e CPU bottlenecks



Como medir o load avarage corretamente ou a melhor forma utilizada.

Nas tradicionais tools do Linux ou Unix temos o bendito do load average que alguns dizem que significam muita coisa e outros dizem que não significa nada.A verdade é : significa muito sim.

O load avg. pode  ser interpretado diretamente quando a maquina possui somente uma(1) CPU.Para maquinas com mais de uma(1) CPU  a forma correta é usar o load avg. factor .
Usando o ferramenta top podemos verificar e entender  o que o sistema nos mostra sobre CPU bottlenecks.

O load avg. mostra a quantidade  de processos que fizeram uso de CPU em um ponto no tempo.

O calculo para medir o load. avg. factor é 

load.avg / nr.CPU =  load.avg.factor

E o entendimento que se pode ter é a respeito de CPU bottleneck:

load avg. factor  < 1 = A distribuição de recurso está dentro da capacidade e se necessário o sistema tem condição de suportar mais carga neste recurso.Enfim,o gargalo não está por aqui.

load avg. factor  entre 1 e 2 = a distribuição do recurso de CPU está dentro da capacidade.

load avg. factor  > 2 = Sim,o gargalo do sistema “pode” estar aqui.É recomendado continuar a investigação usando outras ferramentas vmstat,sar entre outras.Não só neste caso,mas verificar a distribuição de rotinas ,processos que fazem uso do servidor de forma mais adequada e monitorar se houve mudança no comportamento do sistema no horário de “gargalo”.

Vou usar o meu desktop com Ubuntu 10.04 como exemplo :

Como saber quantas CPU’s existem na maquina ?Existem varias formas : /proc/cpuinfo,top,vmstat e etc..

ex.

jccorrea|mydesktop ~ 
$ cd /proc/
jccorrea|mydesktop /proc 
$ ls |grep cpu
cpuinfo
jccorrea|mydesktop /proc 
$ cat cpuinfo 
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 15
model name : Intel(R) Core(TM)2 Quad CPU    Q6600  @ 2.40GHz
stepping : 11
cpu MHz : 1596.000
cache size : 4096 KB
physical id : 0
siblings : 4
core id : 0
cpu cores : 4
apicid : 0
initial apicid : 0

ou  o comando top com a opção 1

ex.

jccorrea|mydesktop /proc 
$ top

top - 12:22:16 up 5 days, 22:28,  7 users,  load average: 0.95, 1.10, 1.10
Tasks: 243 total,   2 running, 241 sleeping,   0 stopped,   0 zombie
Cpu0  : 16.8%us,  3.9%sy,  0.3%ni, 78.9%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu1  :  9.4%us,  2.6%sy,  0.0%ni, 88.1%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu2  : 11.4%us,  2.5%sy,  0.3%ni, 85.8%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu3  :  5.3%us,  1.2%sy,  0.0%ni, 93.4%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   4124916k total,  3352532k used,   772384k free,   156916k buffers
Swap:  9936888k total,    18436k used,  9918452k free,   729968k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                         
31948 jccorrea  20   0  206m 107m  22m S   18  2.7 297:34.37 plugin-containe                                                                                 
  888 root      20   0  316m 203m  92m S    9  5.0 278:51.67 Xorg                                                                                            


Vamos ver o load average agora:     

ex.

top - 12:19:02 up 5 days, 22:25,  7 users,  load average: 1.23, 1.24, 1.14
Tasks: 243 total,   2 running, 241 sleeping,   0 stopped,   0 zombie
Cpu(s):  8.1%us,  2.0%sy,  0.2%ni, 89.6%id,  0.1%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   4124916k total,  3344672k used,   780244k free,   157260k buffers
Swap:  9936888k total,    18436k used,  9918452k free,   729888k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                  
31948 jccorrea  20   0  206m 107m  22m S   19  2.7 296:56.74 plugin-containe          
 2837 jccorrea  20   0  464m 104m  27m S    7  2.6   3632:16 chrome                   
  888 root      20   0  320m 203m  92m S    3  5.0 278:40.71 Xorg                     
 3132 jccorrea  20   0  118m  53m  25m S    3  1.3   0:39.93 VirtualBox               
...

Aqui já temos o número de CPUs que no caso são 4.
Lembrando que o top mostra o load avg: (no momento,5 minutos atras e 15 minutos atrás)

Calculando o load avg.factor usando o snaphot do top :

now - 1.23/4 = 0.3075
5 minutes past = 1.24/4 = 0.31
15 minutes past = 1.14/4 = 0.285

Por aqui está tudo sobre controle .

Vamos ver agora um exemplo com um servidor mais pontente :

[oracle@potente proc]$ top
top - 13:40:11 up 118 days,  8:18,  2 users,  load average: 0.35, 0.47, 0.46
Tasks: 376 total,   2 running, 374 sleeping,   0 stopped,   0 zombie
Cpu0  :  0.0%us,  0.3%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu1  :  0.3%us,  0.0%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu2  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu3  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu4  :  1.0%us,  0.0%sy,  0.0%ni, 98.7%id,  0.0%wa,  0.0%hi,  0.3%si,  0.0%st
Cpu5  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu6  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu7  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu8  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu9  :  0.7%us,  0.3%sy,  0.0%ni, 99.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu10 :  2.0%us,  0.3%sy,  0.0%ni, 97.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu11 :  0.3%us,  0.0%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu12 : 18.3%us,  0.3%sy,  0.0%ni, 81.4%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu13 :  0.3%us,  0.3%sy,  0.0%ni, 99.3%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu14 :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu15 :  0.0%us,  0.0%sy,  0.0%ni, 99.3%id,  0.3%wa,  0.0%hi,  0.3%si,  0.0%st
Mem:  37037264k total, 36884956k used,   152308k free,   185104k buffers
Swap: 39086136k total,   433948k used, 38652188k free, 33778168k cached
  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                         
 4771 oracle    16   0 15.6g 2.0g 2.0g R 17.9  5.7  36:48.93 oracle                                                                                          
26119 oracle    15   0 15.6g 3.2g 3.2g S  2.7  9.0   0:20.04 oracle                                                                                          
26095 oracle    15   0 15.6g 3.2g 3.1g S  1.0  8.9   0:19.70 oracle                                                                                          
11298 oracle    15   0 15.6g  89m  87m S  0.3  0.2   1733:08 oracle                                                                                          
27260 oracle    15   0 12976 1328  824 R  0.3  0.0   0:00.05 top       

Calculando o load avg.factor usando o snaphot do top :

now - 0.35/16 = 0.02
5 minutes past = 0.47/16 = 0.03
15 minutes past = 1.14/16 = 0.03

Vamos aumentar este load avg. no meu desktop :

$ top

top - 16:00:37 up 6 days,  2:06,  7 users,  load average: 10.01, 5.42, 2.83
Tasks: 259 total,   1 running, 258 sleeping,   0 stopped,   0 zombie
Cpu(s): 11.1%us,  2.7%sy,  0.1%ni,  6.0%id, 80.0%wa,  0.0%hi,  0.1%si,  0.0%st
Mem:   4124916k total,  4012600k used,   112316k free,     5040k buffers
Swap:  9936888k total,   806524k used,  9130364k free,   154860k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                         
31948 jccorrea  20   0  206m  27m 7556 S   12  0.7 339:09.89 plugin-containe                                                                                 
 5359 jccorrea  20   0 1024m 111m  10m S   11  2.8   0:05.61 java                                                                                            
  888 root      20   0  349m 167m 100m S    9  4.2 292:35.67 Xorg                                                                                            
 2837 jccorrea  20   0  464m  56m  11m S    8  1.4   3650:16 chrome                                                                                          
 5182 jccorrea  20   0 1080m 240m  11m S    7  6.0   0:21.98 java                                                                                            
 5261 jccorrea  20   0 1050m 149m  11m S    3  3.7   0:12.24 java                                                                                            
 1314 jccorrea   9 -11  158m  11m 9996 S    2  0.3 107:28.12 pulseaudio                                                                                     

Calculando o load avg.factor :

now - 10.01/4 = 2.50
5 minutes past = 5.42/4 = 1.35
15 minutes past = 2.83/4 = 0.71


Como podemos ver neste instante em que fiz um uso maior de aplicativos no meu desktop o recurso de CPU foi maiormente utilizado tanto que no ponto “now” em que foi tirado o snapshot o servidor estava com o consumo de CPU utilizado  acima da capacidade.

Nos servidores de banco de dados funciona da mesma forma.Quando monitorado e você verificar auto consumo de CPU fora do normal sempre procure saber o motivo para nunca ser pego “desprovido “de informação  .Usando as próprias ferramentas nativas do Linux e Oracle você poderá identificar o processo “causador” do auto consumo.O problema não é o auto consumo em si,mas quando isso acontece outra aplicação/recurso pode ficar sem a devida prioridade e sem o devido recurso de CPU necessário para o seu funcionamento chegando em casos extremos de parar ou deixar de responder as solicitações por falta de recurso.Já vi casos em que não era possível mesmo se logar via ssh no servidor e a unica solução ser ir fisicamente no servidor e fazer o reboot ou na maioria dos casos ele mesmo se encarregava de faze-lô!.

Distribua melhor os recursos no ser servidor e seja feliz !


Espero que este  post contribua em algum ponto no seu aprendizado.

Abs,
JC

3 comments:

Alexsandro Haag said...

Legal Júlio. Sempre avalio o load average nas minhas análises de desempenho, mas não costumava considerar o "Factor". Vou passar a analisar desta forma de agora em diante.

Muito Bom. Dica preciosa!

Unknown said...
This comment has been removed by the author.
Unknown said...

Fala Alexsandro,

Obrigadopor passar aqui.
Eu também media sem usar o factor.Depois de ler uma guide da Oracle sobre Linux achei este calculo e comecei a usar.Quando pegava loads altos eu desconsiderava o valor e seguia por outras medições como CPU,Wait e idle.

Achei coerente o uso do factor para mais de 1 cpu.

Abraços,

JC