Pular para o conteúdo
  • This topic has 1 reply, 2 voices, and was last updated 8 years ago by Avatar photoJosé Laurindo Chiappa.
Viewing 2 posts - 1 through 2 (of 2 total)
  • Author
    Posts
  • #108500
    Avatar de Kleber C OliveiraKleber C Oliveira
    Participant

      Boa tarde a todos,

      Estou cuidando de uma aplicação que passei a dar manutenção que usa banco de dados Oracle 10 só que em alguns momentos tem alguma coisa (query, package, etc) que está consumindo todo o recurso do servidor e por muitas vezes está travando a máquina fazendo tudo parar. Então perunto há alguma consulta que eu possa executar que me ajude a identificar o que está consumindo todo o recurso do servidor, tipo ver tudo que está em execução no banco e quanto está consumindo de memória e processador, ou se tem algo deste tipo nas ferramentas do Oracle.

      #108502
      Avatar photoJosé Laurindo Chiappa
      Moderator

        Opa, blz ? Então, com certeza que existem diversas queries/packages/ferramentas do banco que te ajudam a identificar consumo de recursos no banco, mas antes de mais nada para podermos te dar uma orientação mais certeira a primeira informação que vc precisa nos dar é a versão Exata do RDBMS em uso aí, com 4 dígitos : só 10g é Insuficiente, mas se vc falar que é (digamos) versão 10.2.0.5 com essa info a gente já sabe identificar….
        A segunda coisa é te passar uns Conceitos importantes pra vc poder Entender a informação que as tools/queries vão te dar… São alguns poucos pontos simples Mas importantes :

        a. o RDBMS Oracle ** não ** controla alocação de CPU ou I/O, ele apenas Consome os recursos controlados pelo Sistema Operacional. Assim sendo, o RDBMS *** não sabe *** quanto vc tem de capacidade de CPU no total, quantos I/Os vc é capaz de fazer no total…. O que ele faz é, a cada vez que precisa usar a CPU ou fazer um I/O, REGISTRAR em memória o tempo (pelo relógio do Sistema Operacional) do início da requisição de recurso e depois, quando o SO tiver dado o recurso que o RDBMS pediu, aí ele registra o tempo de novo, E grava isso num registro de uma tabela interna…
        PORTANTO, o que vc vai obter nas queries/tools que vou indicar é quantos microsegundos de CPU a sessão gastou até agora (e NÃO porcentagem de uso da CPU), e quantos I/Os a sessão fez e quantos milisegundos eles demoraram (e NÂO a taxa de utilização de I/O percentual)… ok ?

        b. dado o ponto acima, é Sempre Interessante vc Também consultar no Sistema Operacional como está o consumo de recursos – ele sim é capaz de te dar um percentual de uso de CPU, uma taxa de alocação de I/O, etc…. As ferramentas pra isso variam de acordo com o Sistema Operacional que vc está usando, nos unix-like vc provavelmente vai ter TOP, SAR, IOSTAT, VMSTAT por exemplo…. Junto com o teu sysadmin vc consegue obter esse tipo de info do SO

        c. obviamente, para não consumir espaço em demasia, o RDBMS Oracle só mantém um único registro na tabela interna sumarizando quantos microsegundos de CPU uma sessão gastou até o momento, quantos I/Os fez no total – esse número por si só não te diz muito, então a praxe é : no momento que vc está enfrentando lentidão, faz uma consulta/roda a tool pra obter o consumo de CPU no momento, espera um minutinho, roda de novo e faça a Subtração entre um e outro, pra vc saber o Quanto uma sessão consumiu no intervalo…. Se vc não fazer assim, vc corre o risco de encontrar sessões que no passado fizeram muito I/O ou consumiram muita CPU (e portanto o número acumulado da tabela interna tá alto) mas que neste momento atual não estão consumindo : o que nós queremos é encontrar quem está Consumindo ** agora **, não quem consumiu no passado, ok ?

        ==> isto posto, a sua resposta : vc deve consultar as tabelas internas através da view V$SESSTAT e a relacionar com V$SESSION (que é onde vc obtém os detalhes de identificação da sessão), e com a V$STATNAME (pois cada tipo de uso de CPU, de I/O ou de outros recursos vai estar especificado nela)…Normalmente, vc vai querer Também eliminar registros que se referem à usuários internos, como o SYS, SYSTEM e DBSNMP/SYSMAN….
        Por exemplo, consultar CPU gasto seria :

        select ‘top cpu process’, sid, username,
        total_user_cpu,
        round(100 * total_user_cpu/greatest(total_cpu,1),2)
        from (select b.sid sid, nvl(b.username, p.name) username,
        sum(value) total_user_cpu
        from v$statname c, v$sesstat a,
        v$session b, v$bgprocess p
        where a.statistic# = c.statistic#
        and p.paddr (+) = b.paddr
        and b.sid = a.sid
        and c.name = ‘CPU used by this session’
        and b.username not in (‘SYS’, ‘SYSTEM’, ‘SYSMAN’, ‘DBSNMP’)
        group by b.sid, nvl(b.username, p.name)
        order by 3 desc),
        (select sum(value) total_cpu
        from v$statname c, v$sesstat a,
        v$session b, v$bgprocess p
        where a.statistic# = c.statistic#
        and p.paddr (+) = b.paddr
        and b.sid = a.sid
        and c.name = ‘CPU used by this session’)
        where rownum Outra opção caso vc não queira escrever queries customizadas é vc usar as tools fornecidas com o banco, que já trazem as queries do tipo já prontas : se seu banco for Enterprise Edition (que é a implementação full, mais completa do RDBMS) E se vc tiver Licença para usar, vc pode usar a AWR (veja a Documentação Oracle correspondente), e caso não vc pode usar o STATSPACK, https://oracle-base.com/articles/8i/statspack-8i é um exemplo…
        A Desvantagem de usar as tools é que (por causa de espaço e performance) normalmente elas só te dão as TOP-n (normalmente TOP-5 ou TOP-10) sessões que mais consomem CPU, I/O ou memória – se isso não te incomoda, pode as usar…

        []s

        Chiappa
        
      Viewing 2 posts - 1 through 2 (of 2 total)
      • You must be logged in to reply to this topic.
      plugins premium WordPress