Erro quando a RAM usada para armazenar mensagens na Fila de Mensagens 2.0 excede a memória alocada

Este artigo fornece ajuda para resolve um problema que ocorre quando a quantidade de RAM que está sendo usada para armazenar mensagens no Microsoft Message Queuing 2.0 (MSMQ 2.0) excede a memória alocada.

Versão original do produto: Enfileiramento de mensagens da Microsoft
Número de KB original: 899613

Sintomas

Quando você envia uma mensagem para uma fila, o MSMQ não aceita a mensagem que você está enviando. Em vez disso, o MSMQ gera uma mensagem de erro de recursos insuficiente . Você recebe essa mensagem de erro no aplicativo que está usando o MSMQ 2.0 para enviar mensagens.

Quando esse problema ocorre, as seguintes informações podem aparecer no rastreamento de pilha de um serviço ou aplicativo de .NET Framework:

Tipo de exceção: System.Messaging.MessageQueueException
MessageQueueErrorCode: InsufficientResources
Mensagem: recursos insuficientes para executar a operação.
ErrorCode: -2147467259
TargetSite: Void SendInternal(System.Object, System.Messaging.MessageQueueTransaction, System.Messaging.MessageQueueTransactionType)
HelpLink: NULL
Fonte: System.Messaging

Além disso, a mensagem acima é registrada no log do aplicativo. Em um aplicativo COM+ Queued Component (QC), a mensagem acima pode ser registrada no log do aplicativo. Esse problema ocorre quando as seguintes condições são verdadeiras:

  • Você tenta enviar uma mensagem no MSMQ.

  • A memória alocada que está sendo usada atualmente para executar o serviço e armazenar mensagens atingiu 2 gigabytes (GB). Por padrão, o Windows 2000 aloca 2 GB de memória endereçável para um processo.

    Depois que o serviço MSMQ é carregado, a quantidade padrão de memória alocada que está disponível para o MSMQ 2.0 para armazenar mensagens está entre 1,6 GB e 1,8 GB.

    Observação

    Se você usar o comutador de 3 GB, a memória alocada ficará entre 2 GB e 2,5 GB.

    Arquivos de armazenamento de mensagens são arquivos mapeados pela memória. Portanto, você pode ver se o limite foi excedido verificando o tamanho da pasta Armazenamento MSMQ. Essa pasta normalmente está localizada na %WinDir%\System32\MSMQ pasta Armazenamento. No entanto, a pasta de armazenamento pode ser configurada para outro local. Para ver se a pasta de armazenamento foi configurada para outro local, procure no campo Pasta Arquivos de Mensagem na guia Armazenamento na ferramenta MSMQ no Painel de Controle.

Motivo

Esse problema ocorre devido a uma ou mais das seguintes razões:

  • O aplicativo que lê e processa as mensagens que chegam nas filas está enfrentando dificuldades. No entanto, as mensagens continuam a chegar nas filas a uma taxa mais rápida do que a taxa na qual o aplicativo pode ler e processar as mensagens.

  • O diário está habilitado nas filas. No entanto, os dados que fazem com que as mensagens se acumulem não foram excluídos.

  • O deadlettering está habilitado nas filas. Além disso, a quantidade de memória alocada que está disponível para armazenar mensagens deadlettered foi atingida ou excedida.

  • As mensagens se acumularam na fila de saída porque a fila de destino não está disponível.

Resolução

O método usado para resolve esse problema depende do status atual do serviço MSMQ. Antes de resolve esse problema, você deve parar os serviços ou aplicativos que estão gravando nas filas.

Se o MSMQ estiver em execução

Determine quais filas acumularam mensagens. Para fazer isso, use um dos seguintes métodos:

  • Examine manualmente as filas usando a interface MSMQ. A interface MSMQ está localizada no console de Gerenciamento de Computadores.

  • Em Monitor de Desempenho, defina todos os contadores no objeto de desempenho DA FILA DO MSMQ. Em seguida, selecione Exibição de relatório . No modo de exibição Relatório, você pode ver o número de mensagens em cada fila.

Depois de determinar quais filas acumularam mensagens, você deve determinar por que as mensagens se acumularam. Há vários motivos possíveis pelos quais as mensagens podem se acumular nas filas. Esses motivos incluem o seguinte:

  • As mensagens que estão na fila de mensagens de saída não podem chegar aos destinos. Se as mensagens não puderem chegar aos destinos, verifique se o computador de destino está disponível para receber mensagens. Se essas mensagens estiverem desatualizadas ou não tiverem valor, desmarque a fila.

  • O aplicativo que deveria receber mensagens parou ou inseriu uma condição de erro. Se uma dessas condições for verdadeira, resolve o problema nesse aplicativo.

  • As mensagens nas filas de letras mortas ou nas filas de diário foram retidas. Essas mensagens não foram removidas ou processadas. Se essas mensagens tiverem sido retidas, determine a finalidade de reter essas mensagens. A opção para mensagens de diário é usada com frequência para testes.

Quando o teste é concluído, essa opção pode ser deixada sem querer habilitada. Se as mensagens forem mortas, as mensagens não serão processadas ou entregues dentro de um tempo especificado. Se a roleta ou o diário estiver ativado, um processo deverá estar lendo essas mensagens fora da fila. Quando você identificou as filas em que as mensagens se acumularam, você pode excluir as mensagens acumuladas.

Se o MSMQ não estiver em execução e você não puder iniciá-lo manualmente

Observação

  • Antes de fazer alterações nos arquivos na pasta Armazenamento MSMQ, recomendamos fazer backup do ambiente MSMQ atual usando MQbkup.exe. Essa etapa é muito importante se você precisar de ajuda dos Serviços de Suporte ao Produto.

  • Como o MSMQ inseriu um estado instável, talvez você não consiga recuperar todas as mensagens. Se você tiver dificuldades para restaurar mensagens usando as etapas a seguir e os dados forem muito importantes, entre em contato com os Serviços de Suporte ao Produto para obter ajuda.

Para fazer backup da configuração do MSMQ usando MQbkup.exe, siga estas etapas.

Observação

Antes de executar MQbkup.exe, selecione uma pasta para a qual você fará backup dos arquivos MSMQ. Essa pasta deve estar localizada em um disco com pelo menos 2,5 GB de espaço disponível.

  1. Abra uma janela de Prompt de Comando.

  2. Altere o diretório para %WinDir%\System32.

  3. Execute o comando

    MQbkup.exe -b Drive :\ Folder to Put Backup Files
    
  4. Observe o local da pasta à qual você fez backup dos arquivos MSMQ.

Iniciar o servidor usando a opção de 3 GB

Observação

A opção de 3 GB é apenas uma opção para o Windows 2000 Advanced Server. Para Windows 2000 Server e para Windows 2000 Professional, acesse a seção Para recuperar manualmente suas mensagens .

Por padrão, o Windows 2000 aloca 2 GB de memória endereçável para cada processo. Esse problema ocorre porque o MSMQ usa toda a alocação. Esse comportamento impede que o serviço reinicie corretamente. Se você usar a opção de 3 GB, o Windows 2000 Advanced Server alocará 3 GB de memória endereçável para cada processo. Essa configuração fornece memória endereçável suficiente para o MSMQ carregar o serviço e os arquivos de armazenamento de mensagens depois de reiniciar o servidor. Essa opção aumenta o armazenamento MSMQ para entre 2 GB e 2,5 GB.

Aviso

Essa configuração pode afetar outros recursos no servidor. Recomendamos que você remova a opção de 3 GB depois de concluir a solução de problemas. Essa configuração não se destina a resolve permanentemente o problema. No entanto, você pode usar essa configuração para acessar o MSMQ para que possa executar as etapas na seção Se o MSMQ estiver em execução .

Para obter mais informações sobre como configurar o Windows para ser executado usando o comutador de 3 GB, confira o suporte de ajuste de memória do aplicativo habilitando no tópico de aplicativos no arquivo ajuda do Windows 2000.

Para recuperar manualmente suas mensagens

Observação

  • Siga estas etapas somente se o MSMQ estiver em um estado que não está em execução.
  • Como o MSMQ está em um estado instável e não será iniciado, talvez você não consiga recuperar todas as mensagens.

Aviso

Esse processo pode fazer com que um aplicativo receba mensagens transacionais em uma ordem diferente da ordem na qual as mensagens chegaram originalmente.

  1. Crie uma pasta temporária para manter seus arquivos de armazenamento de mensagens. Não coloque essa pasta na pasta MSMQ.

  2. Selecione apenas os arquivos que têm a extensão de nome do arquivo .mq .

    Aviso

    Alguns arquivos localizados na pasta Armazenamento MSMQ são essenciais para que o MSMQ seja executado corretamente. Verifique se você seleciona apenas os arquivos que têm a extensão de nome do arquivo .mq .

  3. Mova os arquivos selecionados para a pasta que você criou na etapa 1.

  4. Verifique se o Driver de Acesso de Dados MSMQ não foi iniciado. Para fazer isso, execute o seguinte comando em um prompt de comando:

    Net Stop MQAC /y
    
  5. Inicie o serviço MSMQ. Para fazer isso, execute o seguinte comando no prompt de comando:

    Net Start MSMQ
    

    Observação

    Se os dados nas mensagens não forem importantes e você só quiser colocar o MSMQ novamente online, você poderá parar aqui.

  6. Depois de verificar se o serviço será iniciado agora, pare o serviço. Para fazer isso, execute o seguinte comando no prompt de comando:

    Net Stop MQAC /y
    

    Esse comando interrompe o serviço MSMQ e o driver do Acesso de Dados.

  7. Na pasta para a qual você moveu os arquivos de armazenamento de mensagens na etapa 5, observe que alguns nomes de arquivo têm um formato p Number.mq e alguns nomes de arquivo têm um formato lNumber.mq. Esses arquivos são armazenados como pares. Cada arquivo p tem um arquivo l correspondente.

    Observe as datas em que os arquivos foram modificados. Selecione o arquivo p mais antigo e o arquivo l correspondente. Mova esses arquivos para a pasta de Armazenamento MSMQ original.

  8. Execute o comando na etapa 5 para iniciar o serviço MSMQ. Se o serviço for iniciado, siga as etapas na seção Se o MSMQ estiver em execução para determinar em quais filas as mensagens estão se acumulando e como lidar com as mensagens.

  9. Depois de remover as mensagens acumuladas das filas, repita as etapas 6 a 8 até retornar todos os arquivos de mensagem para a pasta Armazenamento MSMQ e você removeu todas as mensagens acumuladas das filas.

    Observação

    Não mova mais de 1,6 GB de dados de volta para a pasta Armazenamento MSMQ ao mesmo tempo. Se você fizer isso, o serviço pode não ser iniciado.

Etapas para reproduzir o problema

Em um computador que está executando o Windows 2000 Server, envie mensagens para uma fila local até que o aplicativo que você está usando para enviar as mensagens receba um 0x00e0027 erro de exceção.

O MSMQ 2.0 armazena mensagens em arquivos mapeados pela memória. Em um computador que está executando o Windows 2000 Server, a quantidade padrão de memória alocada que está disponível para o MSMQ 2.0 é de 2 GB. Depois que os componentes do MSMQ 2.0 são carregados no computador, a quantidade de memória alocada que está disponível para o MSMQ 2.0 é reduzida para entre aproximadamente 1,6 GB e 1,8 GB.

Se você habilitar a opção de 3 GB no arquivo Boot.ini , a quantidade de memória alocada disponível para MSMQ 2.0 aumentará para 3 GB. Depois que os componentes do MSMQ 2.0 são carregados no computador, a quantidade de memória alocada que está disponível para o MSMQ 2.0 é reduzida para 2,7 GB.

No entanto, a memória alocada adicional também tira aproximadamente 1 GB de memória alocada do kernel. Esse comportamento pode afetar o desempenho do sistema e pode afetar aplicativos que executam a E/S do arquivo.

Não recomendamos que você use a opção de 3 GB apenas para aumentar a quantidade de memória alocada que está disponível para o MSMQ 2.0. Em vez disso, recomendamos que você configure uma cota de computador para evitar o problema mencionado na seção Sintomas .

Para obter mais informações, confira Como configurar cotas de computador e cotas de fila na Fila de Mensagens da Microsoft.