none
Erro de memória (E_OUTOFMEMORY (0X8007000E)) na execução do ETL RRS feed

  • Pergunta

  • Pessoal, em um cliente da empresa, temos um sistema BI (SQL Server 2005) com interface de usuário <st1:personname productid="em ASP.Net. Recentemente" w:st="on">em ASP.Net. Recentemente</st1:personname> o sistema foi migrado para um novo servidor de produção (Windows Server 2003 de 32 bits) e passou a apresentar problemas em um dos quatros ETLs existentes. Antes da migração, no servidor antigo, o sistema funcionava bem, apenas não escalava bem devido às deficiências da máquina. A máquina atual possui 12 GB de RAM e HD de 80 GB (60 GB de espaço livre) e é totalmente dedicada para a aplicação.

    Para visualizar o erro, executei o package manualmente (normalmente é uma rotina que o executa) e capturei o seguinte erro:

    Aparentemente é um erro de memória. Pesquisando, descobri que o erro 0X8007000E é gerado pelo SO, avisando que houve falha na alocação de memória (nada que vai muito contra ao que foi mostrado pela imagem).

    As configurações de memória do SQL Server no momento da falha são:

    • AWE habilitado;
    • Minimum server memory: 512 MB;
    • Max. Server memory : 8 GB
    • Min. memory per query: 1024 KB

    Memória virtual:

    • Initial size: 2046 MB;
    • Max size: 4092 MB (4 GB)

    Acontece que o mesmo ETL funciona perfeitamente em uma máquina de Homologação (Windows Server 2003 de 32 bits) que é bem inferior ao que temos em Produção.

     A máquina de Desenvolvimento possui 8 GB de RAM e as configurações do SQL Server e memória virtual são:

    • AWE habilitado;
    • Minimum server memory: 512 MB;
    • Max. Server memory : 3584 MB
    • Min. memory per query: 1024 KB

    Memória virtual:

    • Initial size: 2046 MB;
    • Max size: 4092 MB (4 GB)

    Também testei em uma máquina de desenvolvimento que temos no escritório (Windows Server 2003, 64 bits com 8 GB de RAM) e funcionou. Pesquisando a respeito do erro de memória, não encontrei nada de muito relevante. Pesquisei algumas formas de aumentar o desempenho do SQL Server e as que mais chamaram a atenção foram:

    -Habilitar a opção AWB (para endereçamentos maiores que 4 GB para sistemas de 32 bits). Esta opção já está habilitada.

    -Opção PAE no arquivo boot.ini do Windows para habilitar 1 GB para SO e 3 GB para os demais aplicativos. Não habilitei essa opção, pois encontrei alguns fórum e documentações que atestam que o Sistema reconhece e habilita automaticamente esta opção para valores maiores do que 4 GB de memória. Pelo Task Manager e Performance Monitor verifique que o sistema estava reconhecendo valores maiores que 4GB.

    -Teste do aumento da memória virtual para valores entre <st1:metricconverter productid="1,5 a" w:st="on">1,5 a</st1:metricconverter> 2 vezes o tamanho da memória física para aumentar o espaço de paginação. Testei um aumento da memória virtual para 16 GB e o erro persistiu.

    Enfim, fiz uma infinidade de teste de configurações, mas sem sucesso. Gostaria de saber se alguém passou por algo parecido e se pode me dá uma luz de onde está o erro.

    quarta-feira, 4 de abril de 2012 14:39

Todas as Respostas

  • Romenique,

    Este erro ocorre em um DataFlow?


    Fabrizzio A. Caputo
    MCT
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Blog Empresa: www.tripletech.com.br/blog
    Twitter: @FabrizzioCaputo
    Email: fabrizzio.antoniaci@gmail.com

    quarta-feira, 4 de abril de 2012 14:46
    Moderador
  • Não, o fluxo passa por todos os Data Flows definidos sem nenhum erro.

    O erro ocorre em um script VB. Neste script estão algumas funções que acessam o banco de dados para fazer algumas inserções, consultas e atualizações.

    Este erro começou após a aplicação ser movida para um novo servidor, no servidor antigo funciona perfeitamente, embora a máquina não tenha a configuração adequada para a aplicação. Um dos teste feitos por mim foi pegar a aplicação no servidor antigo  de homologação(não havia sido removida) e testar o mesmo ETL com os mesmo arquivos fontes de dados (txt de origem dos dados) e funcionou perfeitamente.

    Como não participei do desenvolvimento nem da instalação da aplicação, trabalho com a hipótese de algum tipo de configuração feita em uma das máquinas não foi feita na outra, mas a princípio não encontrei nenhuma alteração de configuração a não ser de memória. Estou aguardando um teste de memória do servidor, pois uma da minhas hipóteses seria um setor defeituoso da memória. Contudo, pelo o que foi passado pelo cliente a máquina recebeu pentes de memória novos recentemente, logo a chance é pequena de defeito na memória.

    Valeu,

    quarta-feira, 4 de abril de 2012 17:48
  • Hrmonique,

    Então o que tem de diferente neste novo servidor? Em relação ao antigo?

    Este VB Script esta configurado em algum componente dentro do seu Dataflow?

    Qual é o volume de dados que estão sendo processados?

    Você poderia explicar o que esta Task Preparação de dados realiza?


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    quinta-feira, 5 de abril de 2012 13:42
    Moderador
  • Pessoal, desculpa a demora em responde

    Eu não desenvolvi a aplicação e também não conheço muito das tecnologias envolvidas, pois não desenvolvo nelas, apenas estou tentando ajudar em um problema recente que surgiu. Quantas as perguntas específicas dos scripts e posso verificar o que cada um faz. Contudo não creio que seja um problema da aplicação, pois:

    1- O ETL da aplicação roda perfeitamente no servidor de homologação, que não é um servidor dedicado (possui várias aplicações penduradas) e é inferior ao de produção . Dados do servidor de Homologação:

    • Windows Server 2003 Standard SP2 (Gerência no máximo 4 GB de memória)
    • 4 GB de memória (Eu tinha citado anteriormente 8 GB)
    • Processador Intel Xeon 3GHz
    • Configurações do SQL Server 2005 que roda na máquina: 

    -AWE habilitado;

    -Minimum server memory: 512 MB;

    -Max. Server memory : 3584 MB

    -Min. memory per query: 1024 KB

    Memória virtual:

    -Initial size: 2046 MB;

    -Max size: 4092 MB (4 GB)

    2- O servidor de produção, que possui a mesma base de dados, o mesmo sistema sem modificações, falha ao executar o ETL (erro da imagem da primeira mensagem). Dados do servidor de Produção que é dedicado a aplicação de BI:

    • Windows Server 2003 Enterprise SP2 
    • 12 GB de memória 
    • Processador Intel Xeon E5310 (possui suporte para PAE)
    • Configurações do SQL Server 2005 que roda na máquina: 

    -AWE habilitado;

    -Minimum server memory: 512 MB;

    -Max. Server memory : 8 GB

    -Min. memory per query: 1024 KB

    Memória virtual:

    -Initial size: 2046 MB;

    -Max size: 4092 MB (4 GB)

    Claramente o servidor de Produção é superior em configuração ao de Homologação e é dedicado à aplicação, ao contrário do servidor de Homologação. Contudo, o ETL não roda em Produção e roda em Homologação. 

    Na mensagem anterior, citei que seria feito um teste nos pentes de memória, mas os pentes estão ok. Uma hipótese que levantei seria o fato do servidor de Produção não está reconhecendo o valor total das memórias instaladas. Verifiquei o arquivo boot.ini e realmente o parâmetro PAE não constava. Contudo pelo Task Manager e pelo Performance Monitor (imagens abaixo) é visível que o servidor reconheceu a totalidade das memórias. Verifiquei no site Intel (http://ark.intel.com/products/28030/Intel-Xeon-Processor-E5310-(8M-Cache-1_60-GHz-1066-MHz-FSB)) e aparentemente o processador reconhece a configuração PAE indiferente da configuração do boot.ini (ver seção Memory Specifications).

    Só para constar, o processamento pelo Task Manager está em 100%, pois no momento do print estavam sendo executados vários cubos do Analysis Services. Esse ETL roda sempre às 20 horas, horário em que o servidor não possui acesso de usuários.

    Existe alguma configuração feita no SQL Server ou no Windows Server 2003 Enterprise que pode limitar o uso de memória por um processo e ocasionar um eventual erro de memória?

    Como medida temporária, rodei o ETL com arquivos do mês passado na máquina de Homologação, com a mesma base de Produção, e movi a base para Produção para que a rotina de trabalho do cliente não sofresse com o problema. Após essa mudança de base tentei rodar um ETL com arquivos recentes novamente e o erro persistiu, rodando em Homologação com os mesmos arquivos, executou perfeitamente.

    Valeu,

    quarta-feira, 11 de abril de 2012 14:16
  • Hromenique,

    Você esta trabalhando com servidores em plataformar de hardware iguais?

    Por acaso o seu ambiente de Produção não seria uma máquina com plataforma x64?


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    segunda-feira, 16 de abril de 2012 16:22
    Moderador
  • Junior,

    Estou acompanhando junto ao Hromenique esta situação, e respondendo a sua pergunta os dois ambientes são de x32.

    terça-feira, 24 de abril de 2012 17:07
  • Camila,

    Inicialmente consiga entender que vocês estão carregando um volume de dados acima do suportado pelo seu ambiente, vou ver se encontro mais informações.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    terça-feira, 24 de abril de 2012 17:49
    Moderador
  • Muito obrigada pela resposta Junior,

    Estamo buscando a solução ainda para este problema, qualquer novidade postamos aqui.

    quinta-feira, 26 de abril de 2012 15:01
  • Ola Camila,

    Em relação a aplicacao em questao, vcs citaram que o VB Script que da erro faz insercoes e atualizacoes. Fiquei pensando em alguns testes para fechar melhor o problema:

    1. A Policy Lock Pages In Memory esta habilitada? (http://msdn.microsoft.com/en-us/library/ms190961(v=sql.90).aspx e http://msdn.microsoft.com/en-us/library/ms190730(v=sql.90).aspx )

    2. Vc ja testou com um valor maior para Maximum Server Memory, particularmente deixa-lo "sem limite"?

    3. As configuracoes referentes a TempDB, Logs e Recovery Model do servidor de producao estão iguais aos do servidor de homologacao? 

    4. Vc ja testou colocando a base em Recovery Mode = Simple para ver se funciona?

    5. Vc poderia testar desabilitando os indices das tabelas que o VB Script (o que da erro) atualiza?

    6. Vc tem certeza que TODAS as bases utilizadas no teste em homologação são identicas as da producao? De repente vc utiliza os mesmos arquivos de producao mas existem outras bases em que sao feitos joins que estao diferentes. Tipicamente, o ambiente de homologacao possui as bases "satelites" ou "auxiliares" diferentes do ambiente de producao.

    Abracos, Daniel.


    -- Se minha sugestão ajudou, por favor marque-a como útil; Se resolveu a questão, por favor marque-a como resposta. Contribua para melhorar o fórum! | daniel@dimamura.com.br

    quarta-feira, 2 de maio de 2012 16:21