Error cuando la RAM que se usa para almacenar mensajes en Message Queue Server 2.0 supera la memoria asignada

En este artículo se proporciona ayuda para resolver un problema que se produce cuando la cantidad de RAM que se usa para almacenar mensajes en Microsoft Message Queue Server 2.0 (MSMQ 2.0) supera la memoria asignada.

Versión original del producto: Cola de mensajes de Microsoft
Número de KB original: 899613

Síntomas

Al enviar un mensaje a una cola, MSMQ no acepta el mensaje que está enviando. En su lugar, MSMQ genera un mensaje de error de recursos insuficiente . Recibirá este mensaje de error en la aplicación que usa MSMQ 2.0 para enviar mensajes.

Cuando se produce este problema, puede aparecer la siguiente información en el seguimiento de pila de un servicio o aplicación de .NET Framework:

Tipo de excepción: System.Messaging.MessageQueueException
MessageQueueErrorCode: InsufficientResources
Mensaje: Recursos insuficientes para realizar la operación.
ErrorCode: -2147467259
TargetSite: Void SendInternal(System.Object, System.Messaging.MessageQueueTransaction, System.Messaging.MessageQueueTransactionType)
HelpLink: NULL
Origen: System.Messaging

Además, el mensaje anterior se registra en el registro de aplicación. En una aplicación COM+ Queued Component (QC), el mensaje anterior se puede registrar en el registro de la aplicación. Este problema se produce cuando se cumplen las condiciones siguientes:

  • Intenta enviar un mensaje en MSMQ.

  • La memoria asignada que se usa actualmente para ejecutar el servicio y almacenar mensajes ha alcanzado los 2 gigabytes (GB). De forma predeterminada, Windows 2000 asigna 2 GB de memoria direccionable a un proceso.

    Una vez que se carga el servicio MSMQ, la cantidad predeterminada de memoria asignada que está disponible para MSMQ 2.0 para almacenar mensajes está entre 1,6 GB y 1,8 GB.

    Nota:

    Si usa el conmutador de 3 GB, la memoria asignada estará entre 2 GB y 2,5 GB.

    Los archivos de almacenamiento de mensajes son archivos asignados a memoria. Por lo tanto, puede ver si se ha superado el límite comprobando el tamaño de la carpeta Almacenamiento de MSMQ. Esta carpeta se encuentra normalmente en la %WinDir%\System32\MSMQ carpeta Storage. Sin embargo, la carpeta de almacenamiento se puede configurar para otra ubicación. Para ver si la carpeta de almacenamiento se ha configurado para otra ubicación, busque en el campo Carpeta de archivos de mensajes de la pestaña Almacenamiento de la herramienta MSMQ de Panel de control.

Causa

Este problema se debe a una o varias de las razones siguientes:

  • La aplicación que lee y procesa los mensajes que llegan a las colas está experimentando dificultades. Sin embargo, los mensajes siguen llegando a las colas a una velocidad más rápida que la velocidad a la que la aplicación puede leer y procesar los mensajes.

  • El registro en diario está habilitado en las colas. Sin embargo, no se han eliminado los datos que hacen que los mensajes se acumulen.

  • Deadlettering está habilitado en las colas. Además, se ha alcanzado o excedido la cantidad de memoria asignada que está disponible para almacenar mensajes fallidos.

  • Los mensajes se han acumulado en la cola saliente porque la cola de destino no está disponible.

Resolución

El método que use para resolver este problema depende del estado actual del servicio MSMQ. Para poder resolver este problema, debe detener los servicios o las aplicaciones que escriben en las colas.

Si MSMQ se está ejecutando

Determine qué colas tienen mensajes acumulados. Para ello, use uno de los métodos siguientes:

  • Examine manualmente las colas mediante la interfaz MSMQ. La interfaz MSMQ se encuentra en la consola de administración de equipos.

  • En Monitor de rendimiento, establezca todos los contadores del objeto de rendimiento MSMQ QUEUE. A continuación, seleccione Vista de informe . En la vista Informe , puede ver el número de mensajes en cada cola.

Una vez que haya determinado qué colas han acumulado mensajes, debe determinar por qué se han acumulado los mensajes. Hay varias razones posibles por las que los mensajes pueden acumularse en las colas. Entre estas razones se incluyen las siguientes:

  • Los mensajes que se encuentran en la cola de mensajes salientes no pueden llegar a sus destinos. Si los mensajes no pueden llegar a sus destinos, asegúrese de que el equipo de destino está disponible para recibir mensajes. Si estos mensajes están obsoletos o no tienen ningún valor, borre la cola.

  • La aplicación que debe recibir mensajes se ha detenido o ha especificado una condición de error. Si una de estas condiciones es verdadera, resuelva el problema en esa aplicación.

  • Los mensajes de las colas de mensajes fallidos o de las colas de diario se han conservado. Estos mensajes no se han quitado ni procesado. Si estos mensajes se han conservado, determine el propósito de conservar estos mensajes. La opción para registrar mensajes en diario se usa con frecuencia para las pruebas.

Cuando se completan las pruebas, esta opción puede dejarse habilitada involuntariamente. Si los mensajes están inactivos, los mensajes no se han procesado ni entregado dentro de un tiempo especificado. Si deadlettering o journaling están activados, un proceso debe leer estos mensajes fuera de la cola. Cuando haya identificado las colas donde se han acumulado los mensajes, puede eliminar los mensajes acumulados.

Si MSMQ no se está ejecutando y no se puede iniciar manualmente

Nota:

  • Antes de realizar cambios en los archivos de la carpeta MSMQ Storage, se recomienda realizar una copia de seguridad del entorno de MSMQ actual mediante MQbkup.exe. Este paso es muy importante si necesita ayuda de product support services.

  • Dado que MSMQ ha entrado en un estado inestable, es posible que no pueda recuperar todos los mensajes. Si experimenta dificultades para restaurar mensajes mediante los pasos siguientes y los datos son muy importantes, póngase en contacto con product support services para obtener ayuda.

Para realizar una copia de seguridad de la configuración de MSMQ mediante MQbkup.exe, siga estos pasos.

Nota:

Antes de ejecutar MQbkup.exe, seleccione una carpeta en la que realizará una copia de seguridad de los archivos MSMQ. Esta carpeta debe encontrarse en un disco que tenga al menos 2,5 GB de espacio disponible.

  1. Abra una ventana del símbolo del sistema.

  2. Cambie el directorio a %WinDir%\System32.

  3. Ejecute el comando:

    MQbkup.exe -b Drive :\ Folder to Put Backup Files
    
  4. Observe la ubicación de la carpeta en la que ha hecho una copia de seguridad de los archivos MSMQ.

Inicie el servidor mediante el modificador de 3 GB.

Nota:

El conmutador de 3 GB solo es una opción para Windows 2000 Advanced Server. Para Windows 2000 Server y Windows 2000 Professional, vaya a la sección Para recuperar manualmente los mensajes .

De forma predeterminada, Windows 2000 asigna 2 GB de memoria direccionable a cada proceso. Este problema se produce porque MSMQ usa toda la asignación. Este comportamiento impide que el servicio se reinicie correctamente. Si usa el conmutador de 3 GB, Windows 2000 Advanced Server asigna 3 GB de memoria direccionable a cada proceso. Esta configuración proporciona a MSMQ suficiente memoria direccionable para cargar el servicio y los archivos de almacenamiento de mensajes después de reiniciar el servidor. Este conmutador aumenta el almacenamiento de MSMQ a entre 2 GB y 2,5 GB.

Advertencia

Esta configuración puede afectar a otros recursos del servidor. Se recomienda quitar el conmutador de 3 GB después de completar la solución de problemas. Esta configuración no está pensada para resolver permanentemente el problema. Sin embargo, puede usar esta configuración para acceder a MSMQ de modo que pueda realizar los pasos de la sección Si MSMQ se está ejecutando .

Para obtener más información sobre cómo configurar Windows para que se ejecute mediante el conmutador de 3 GB, vea el tema Habilitación de la compatibilidad con la optimización de memoria de aplicaciones en las aplicaciones en el archivo de Ayuda de Windows 2000.

Para recuperar manualmente los mensajes

Nota:

  • Siga estos pasos solo si MSMQ está en un estado no en ejecución.
  • Dado que MSMQ está en un estado inestable y no se iniciará, es posible que no pueda recuperar todos los mensajes.

Advertencia

Este proceso puede hacer que una aplicación reciba mensajes transaccionales en un orden diferente del orden en que los mensajes llegaron originalmente.

  1. Cree una carpeta temporal para almacenar los archivos de almacenamiento de mensajes. No coloque esta carpeta en la carpeta MSMQ.

  2. Seleccione solo los archivos que tengan la extensión de nombre de archivo .mq .

    Advertencia

    Algunos archivos que se encuentran en la carpeta MSMQ Storage son fundamentales para que MSMQ se ejecute correctamente. Asegúrese de seleccionar solo los archivos que tienen la extensión de nombre de archivo .mq .

  3. Mueva los archivos seleccionados a la carpeta que creó en el paso 1.

  4. Asegúrese de que el controlador de acceso a datos de MSMQ no está iniciado. Para ello, ejecute el siguiente comando en un símbolo del sistema:

    Net Stop MQAC /y
    
  5. Inicie el servicio MSMQ. Para ello, ejecute el comando siguiente en el símbolo del sistema:

    Net Start MSMQ
    

    Nota:

    Si los datos de los mensajes no son importantes y solo quiere volver a poner MSMQ en línea, puede detenerse aquí.

  6. Una vez que haya comprobado que el servicio se iniciará ahora, detenga el servicio. Para ello, ejecute el comando siguiente en el símbolo del sistema:

    Net Stop MQAC /y
    

    Este comando detiene el servicio MSMQ y el controlador de acceso a datos.

  7. En la carpeta a la que ha movido los archivos de almacenamiento de mensajes en el paso 5, observe que algunos nombres de archivo tienen un formatop Number.mq y algunos nombres de archivo tienen un formatol Number.mq. Estos archivos se almacenan como pares. Cada archivo p tiene un archivo l correspondiente.

    Observe las fechas en que se modificaron los archivos. Seleccione el archivo p más antiguo y el archivo l correspondiente. Mueva estos archivos a la carpeta original de MSMQ Storage.

  8. Ejecute el comando en el paso 5 para iniciar el servicio MSMQ. Si se inicia el servicio, siga los pasos de la sección If MSMQ is running (Si MSMQ se está ejecutando ) para determinar en qué colas se acumulan los mensajes y cómo controlarlos.

  9. Después de quitar los mensajes acumulados de las colas, repita los pasos del 6 al 8 hasta que haya devuelto todos los archivos de mensajes a la carpeta Almacenamiento de MSMQ y haya quitado todos los mensajes acumulados de las colas.

    Nota:

    No mueva más de 1,6 GB de datos a la carpeta Almacenamiento de MSMQ al mismo tiempo. Si lo hace, es posible que el servicio no se inicie.

Pasos para reproducir el problema

En un equipo que ejecuta Windows 2000 Server, envíe mensajes a una cola local hasta que la aplicación que usa para enviar los mensajes reciba un 0x00e0027 error de excepción.

MSMQ 2.0 almacena mensajes en archivos asignados a memoria. En un equipo que ejecuta Windows 2000 Server, la cantidad predeterminada de memoria asignada que está disponible para MSMQ 2.0 es de 2 GB. Después de cargar los componentes de MSMQ 2.0 en el equipo, la cantidad de memoria asignada que está disponible para MSMQ 2.0 se reduce a entre aproximadamente 1,6 GB y 1,8 GB.

Si habilita el conmutador de 3 GB en el archivo Boot.ini , la cantidad de memoria asignada que está disponible para MSMQ 2.0 aumenta a 3 GB. Después de cargar los componentes de MSMQ 2.0 en el equipo, la cantidad de memoria asignada que está disponible para MSMQ 2.0 se reduce a 2,7 GB.

Sin embargo, la memoria asignada adicional también toma aproximadamente 1 GB de memoria asignada del kernel. Este comportamiento puede afectar al rendimiento del sistema y puede afectar a las aplicaciones que realizan E/S de archivo.

No se recomienda usar el conmutador de 3 GB solo para aumentar la cantidad de memoria asignada que está disponible para MSMQ 2.0. En su lugar, se recomienda configurar una cuota de equipo para evitar el problema que se menciona en la sección Síntomas .

Para obtener más información, consulte Configuración de cuotas de equipos y cuotas de cola en Microsoft Message Queue Server.