Como determinar o SQL causando picos de CPU Oracle

2

Eu tenho um webapp J2EE Spring / Hibernate usando o Oracle 11g para persistência, ocasionalmente em produção a CPU da Oracle atinge 100% de uso, reiniciar o Tomcat descarta a CPU da Oracle. Não consigo replicar isso no teste, mesmo usando uma exportação da produção. Existe alguma maneira de ter o Oracle me mostrar a instrução SQL que está causando o pico? Ou existe outra abordagem que eu possa tomar para me ajudar a descobrir onde está o problema?

Informação adicional: Webapp e Oracle em caixas diferentes (ambas as janelas). Usando JDBC sobre SSL

Obrigado.

    
por BZ. 06.11.2009 / 21:16

3 respostas

2

Quando a produção atinge 100% da CPU, você (ou seu DBA) pode executar o comando "top", pegar o id do processo que mais contribui para a CPU (supondo que você tenha apenas alguns deles) e usar a seguinte consulta pegar a sessão e o que ela está fazendo no momento:

selecione p.SPID UnixProcess, s.SID, s.serial #, s.USERNAME, s.COMMAND, s.MACHINE, s.SQL_ADDRESS, s.SQL_HASH_VALUE , s.program, status, cpu_time, busca, disk_reads, buffer_gets, rows_processed, execuções, child_latch, evento, sql_text, COMMAND_TYPE de gv $ session s junção externa esquerda gv $ process p em p.ADDR = s.PADDR e s.inst_id = p.inst_id junção externa esquerda gv $ sqlarea sa em sa.ADDRESS = s.SQL_ADDRESS e s.inst_id = sa.inst_id Onde p.spid =

    
por 10.11.2009 / 01:47
2

Você pode ativar o rastreamento de desempenho no banco de dados e monitorar a execução de suas consultas com alguns utilitários incorporados.

Eu pessoalmente não fiz isso no Oracle, mas eles têm documentação on-line para apontar na direção certa.

link

    
por 06.11.2009 / 21:27
1

Você deve realmente verificar que no ciclo de vida de seus servlets, você está fechando corretamente suas conexões de banco de dados e que os objetos que você usa em seus servlets estão sendo coletados corretamente. às vezes pode haver vazamentos de memória muito complicados nos servlets, ainda mais se você estiver usando algum tipo de estrutura de DI.

Eu tive um vazamento de memória em um servlet que estava sendo coletado como lixo, mas ao fazer algum RMI para outro aplicativo, os objetos do proxy não estavam sendo coletados, então isso estava consumindo toda a minha memória livre.

Confira este artigo sobre dicas para testes de desempenho e verificação de memória em servlets.

link

    
por 07.11.2009 / 00:57