Pular para o conteúdo
  • Este tópico contém 4 respostas, 3 vozes e foi atualizado pela última vez 14 anos, 1 mês atrás por Avatar de David SiqueiraDavid Siqueira.
Visualizando 5 posts - 1 até 5 (de 5 do total)
  • Autor
    Posts
  • #94994
    Avatar de armandovelosoarmandoveloso
    Participante

      Srs,
      Plataforma: Oracle 9i em Windows Server 2003 32 bits.

      Sistema desktop que utiliza um usuario apenas do BD para conectar-se ao banco.
      Configurei no PROFILE, o parametro IDLE_TIME para 30 MINUTOS.

      Bom, não são “erros”, mas abaixo cito alguns questionamentos:

      1) Após 30 minutos de “inatividade”, as sessoes ficam com status= SNIPED, o que eu ja esperava… o problema é que usuarios que rodam operacoes longas (acima desse tempo de 30 minutos) também entraram nessa conta e o transtorno foi imediato, pois suas sessoes foram desconectadas enquanto que a aplicação estava “rodando” alguma coisa;

      2) Rodo script (kill session immediate) entao para matar as sessoes cujo status = sniped, daí vejo VIA SQLPLUS que as sessoes ficam um bom tempo com status=KILLED, mas essas mesmas sessoes nao aparecem na console ENTERPRISE MANAGER, é normal nao aparecer?

      3) Como o Windows abre apenas UM PROCESSO para o Oracle (não abre um processo para cada sessao de usuario, como no linux), vi pelo TASK MANAGER do windows, na coluna “Threads” (que sempre corresponde ao nr de sessoes de usuarios+system), que fica contando também com as sessoes “killed”. Como tem demorado demais a desaparecerem do BD essas sessoes “KILLED”, chega a estourar memoria do SO a medida que novas sessoes sao abertas, pois ja trabalha no limite (em torno de 450 conexoes simultaneas);

      Bom, o item 3 foi mais pra citar o caso, vou redimensionar a SGA para que o SO tenha mais RAM pra segurar mais sessoes de usuarios…

      O que tem dificultado é mais o item 1…

      Alguma sugestão?

      Obrigado!

      #95074
      Avatar de BogosBogos
      Participante

        Quanto ao item 2, é normal, uma sessão KILLED está realmente morta, você pode ver a sessão mas ela não existe mais, teoricamente falando.

        Quanto ao primeiro item, esse é um problema quase que comum. O IDLE_TIME deve ser alterado com muita cautela por essa razão. Uma solução é manter um IDLE_TIME mais longo e utilizar uma job pra fazer o serviço de matar as sessões que estão INACTIVE por mais de 30 minutos.

        Espero ter ajudado em algo.
        Abraços!

        #95099
        Avatar de David SiqueiraDavid Siqueira
        Participante

          Problematica interessante, passo por isso também, porém não tenho processos que levam mais de 30 minutos, e acredito que se você puder dar uma olhadinha nesses que você tem poderá melhora-los e deixalos mais performaticos, até para evitar que você esbarre no inevitavel, hoje vc dá mais vazão ao seu BD pra que ele suporte mais, amanha ele chegara no limite dinovo…é um monstro em evolução.

          O melhor seria um tunning nesses processos demorados, reajustar seu IDLE_TIME depois disso, ou usar o RESOURCE MANAGER e limitar via recurso de máquina, se esse for o caso.

          Quanto aos processos no Winows vc pode matalos via ORAKILL se for o caso, um aplicativo do próprio ORACLE que é bem conhecido pela galera da OLD SCHOOL..rss..
          Segue a query que vai te informar as sessões ATRASADAS que precisam ser eliminadas atraves dele :

          set serveroutput on size 50000
          declare
          varIns varchar2(5);
          varhost varchar2(15);
          varVersao varchar2(30);
          cursor c1 is (SELECT b.spid as processo
          FROM v$session a, v$process b
          WHERE a.paddr=b.addr
          and a.username is not null
          and a.username not in ('SYS','SYSTEM')
          and trunc(a.logon_time) < trunc(sysdate));
          regc1 c1%rowtype;
          begin
          select instance_name, host_name, version into varIns,varHost,varVersao from v$instance;
          dbms_output.put_line ('HOSTNAME:' || varHost);
          dbms_output.new_line;
          open c1;
          loop
          fetch c1 into regc1;
          exit when c1%notfound;
          if (substr(varVersao,1,1)=8 or substr(varVersao,1,1)=9) then
          dbms_output.put_line ('orakill ' || varIns || ' ' || regc1.processo);
          else
          dbms_output.put_line ('kill -9 ' || regc1.processo);
          end if;
          end loop;
          close c1;
          end;
          /[code]

          #95176
          Avatar de armandovelosoarmandoveloso
          Participante

            Obrigado pelas dicas,

            mas como é aplicacao de terceiro,
            fica dificil eu aplicar PROFILE pois a aplicacao usa UM ÚNICO USUARIO para conectar ao banco…
            Todas as sessoes usam o mesmo usuario, entao nao consigo aplicar IDLE_TIME ou limitar recursos de hardware para apenas alguns usuarios…

            Alguns processam por horas, mas muita coisa tambem é leitura de arquivos em filesystem… daí demora mesmo…

            #95177
            Avatar de David SiqueiraDavid Siqueira
            Participante

              Bom Armando, neste caso então seria o mais indicado fazer uma Reorganização no seu Banco, alguns Moves, Shrinks e Rebuilds para com isso você poder ganhar alguma performance a mais e minimizar esse seu problema.

              Desse modo você não precisaria se “preocupar” tanto com a aplciação dos Profiles.

              Abraço!!

            Visualizando 5 posts - 1 até 5 (de 5 do total)
            • Você deve fazer login para responder a este tópico.
            plugins premium WordPress