메시지 큐 2.0에 메시지를 저장하는 데 사용되는 RAM이 할당된 메모리를 초과하는 경우 오류 발생

이 문서에서는 Microsoft Message Queuing 2.0(MSMQ 2.0)에 메시지를 저장하는 데 사용되는 RAM 양이 할당된 메모리를 초과할 때 발생하는 문제를 resolve 데 도움이 됩니다.

원래 제품 버전: Microsoft 메시지 큐
원래 KB 번호: 899613

증상

큐에 메시지를 보낼 때 MSMQ는 보내는 메시지를 수락하지 않습니다. 대신 MSMQ는 리소스 부족 오류 메시지를 생성 합니다 . MSMQ 2.0을 사용하여 메시지를 보내는 애플리케이션에서 이 오류 메시지가 표시됩니다.

이 문제가 발생하면 .NET Framework 서비스 또는 애플리케이션의 스택 추적에 다음 정보가 나타날 수 있습니다.

예외 유형: System.Messaging.MessageQueueException
MessageQueueErrorCode: InsufficientResources
메시지: 작업을 수행할 리소스가 부족합니다.
ErrorCode: -2147467259
TargetSite: Void SendInternal(System.Object, System.Messaging.MessageQueueTransaction, System.Messaging.MessageQueueTransactionType)
HelpLink: NULL
원본: System.Messaging

또한 위의 메시지는 애플리케이션 로그에 기록됩니다. COM+ QC(Queued Component) 애플리케이션에서 위의 메시지가 애플리케이션 로그에 기록될 수 있습니다. 이 문제는 다음 조건이 충족될 때 발생합니다.

  • MSMQ에서 메시지를 보내려고 합니다.

  • 현재 서비스를 실행하고 메시지를 저장하는 데 사용되는 할당된 메모리가 2GB(기가바이트)에 도달했습니다. 기본적으로 Windows 2000은 프로세스에 2GB의 주소 지정 가능 메모리를 할당합니다.

    MSMQ 서비스가 로드된 후 MSMQ 2.0에서 메시지를 저장할 수 있는 할당된 메모리의 기본 크기는 1.6GB에서 1.8GB 사이입니다.

    참고

    3GB 스위치를 사용하는 경우 할당된 메모리는 2GB에서 2.5GB 사이입니다.

    메시지 스토리지 파일은 메모리 매핑된 파일입니다. 따라서 MSMQ Storage 폴더의 크기를 확인하여 제한을 초과했는지 여부를 확인할 수 있습니다. 이 폴더는 일반적으로 Storage 폴더에 %WinDir%\System32\MSMQ 있습니다. 그러나 스토리지 폴더는 다른 위치에 대해 구성할 수 있습니다. 스토리지 폴더가 다른 위치에 대해 구성되었는지 확인하려면 제어판 MSMQ 도구의 스토리지 탭에 있는 메시지 파일 폴더 필드를 참조하세요.

원인

이 문제는 다음과 같은 이유 중 하나 이상으로 인해 발생합니다.

  • 큐에 도착하는 메시지를 읽고 처리하는 애플리케이션에 어려움이 있습니다. 그러나 메시지는 애플리케이션이 메시지를 읽고 처리할 수 있는 속도보다 빠른 속도로 큐에 계속 도착합니다.

  • 큐에서 저널링을 사용할 수 있습니다. 그러나 메시지가 누적되는 데이터는 삭제되지 않았습니다.

  • 큐에서 데드레터링을 사용할 수 있습니다. 또한 배달 못한 메시지를 저장하는 데 사용할 수 있는 할당된 메모리의 양에 도달했거나 초과되었습니다.

  • 대상 큐를 사용할 수 없으므로 메시지가 나가는 큐에 누적되었습니다.

해결 방법

이 문제를 resolve 데 사용하는 메서드는 MSMQ 서비스의 현재 상태 따라 달라집니다. 이 문제를 resolve 큐에 쓰는 서비스 또는 애플리케이션을 중지해야 합니다.

MSMQ가 실행 중인 경우

누적된 메시지가 있는 큐를 결정합니다. 이렇게 하려면 다음 방법 중 하나를 사용합니다.

  • MSMQ 인터페이스를 사용하여 큐를 수동으로 검사합니다. MSMQ 인터페이스는 컴퓨터 관리 콘솔에 있습니다.

  • 성능 모니터 MSMQ QUEUE 성능 개체의 모든 카운터를 설정합니다. 그런 다음 보고서 보기를 선택합니다. 보고서 보기에서 각 큐의 메시지 수를 볼 수 있습니다.

누적된 메시지가 있는 큐를 확인한 후에는 메시지가 누적된 이유를 확인해야 합니다. 메시지가 큐에 누적되는 몇 가지 가능한 이유가 있습니다. 이러한 이유는 다음과 같습니다.

  • 나가는 메시지 큐에 있는 메시지는 대상에 연결할 수 없습니다. 메시지가 대상에 도달할 수 없는 경우 대상 컴퓨터를 사용하여 메시지를 받을 수 있는지 확인합니다. 이러한 메시지가 오래되었거나 값이 없는 경우 큐를 지웁니다.

  • 메시지를 수신해야 하는 애플리케이션이 중지되었거나 오류 조건을 입력했습니다. 이러한 조건 중 하나가 true이면 해당 애플리케이션에서 문제를 resolve.

  • 배달 못한 편지 큐 또는 저널 큐의 메시지는 보존되었습니다. 이러한 메시지는 제거되거나 처리되지 않았습니다. 이러한 메시지가 보존된 경우 이러한 메시지를 보존하는 용도를 결정합니다. 저널 메시지에 대한 옵션은 테스트에 자주 사용됩니다.

테스트가 완료되면 이 옵션은 의도치 않게 사용하도록 설정되었을 수 있습니다. 메시지가 배달되지 않은 경우 지정된 시간 내에 메시지가 처리되거나 배달되지 않습니다. 데드레터링 또는 저널링이 켜져 있는 경우 프로세스는 큐에서 이러한 메시지를 읽어야 합니다. 메시지가 누적된 큐를 식별한 경우 누적된 메시지를 삭제할 수 있습니다.

MSMQ가 실행되고 있지 않고 수동으로 시작할 수 없는 경우

참고

  • MSMQ Storage 폴더의 파일을 변경하기 전에 MQbkup.exe 사용하여 현재 MSMQ 환경을 백업하는 것이 좋습니다. 이 단계는 제품 지원 서비스의 도움이 필요한 경우 매우 중요합니다.

  • MSMQ가 불안정한 상태로 진입했기 때문에 모든 메시지를 복구하지 못할 수 있습니다. 다음 단계를 사용하여 메시지를 복원하는 데 어려움이 있고 데이터가 매우 중요한 경우 제품 지원 서비스에 문의하여 도움을 받으세요.

MQbkup.exe 사용하여 MSMQ 구성을 백업하려면 다음 단계를 수행합니다.

참고

MQbkup.exe 실행하기 전에 MSMQ 파일을 백업할 폴더를 선택합니다. 이 폴더는 사용 가능한 공간이 2.5GB 이상인 디스크에 있어야 합니다.

  1. 명령 프롬프트 창을 엽니다.

  2. 디렉터리를 로 변경합니다 %WinDir%\System32.

  3. 다음 명령을 실행합니다.

    MQbkup.exe -b Drive :\ Folder to Put Backup Files
    
  4. MSMQ 파일을 백업한 폴더의 위치를 확인합니다.

3GB 스위치를 사용하여 서버 시작

참고

3GB 스위치는 Windows 2000 고급 서버에 대한 옵션일 뿐입니다. Windows 2000 Server 및 Windows 2000 Professional의 경우 메시지를 수동으로 복구하려면 섹션으로 이동합니다.

기본적으로 Windows 2000은 각 프로세스에 2GB의 주소 지정 가능 메모리를 할당합니다. 이 문제는 MSMQ에서 전체 할당을 사용하기 때문에 발생합니다. 이 동작으로 인해 서비스가 올바르게 다시 시작되지 않습니다. 3GB 스위치를 사용하는 경우 Windows 2000 고급 서버는 각 프로세스에 3GB의 주소 지정 가능 메모리를 할당합니다. 이 구성은 서버를 다시 시작한 후 MSMQ에서 서비스 및 메시지 스토리지 파일을 로드할 수 있는 충분한 주소 지정 가능 메모리를 제공합니다. 이 스위치는 MSMQ 스토리지를 2GB에서 2.5GB 사이로 증가합니다.

경고

이 구성은 서버의 다른 리소스에 영향을 줄 수 있습니다. 문제 해결을 완료한 후 3GB 스위치를 제거하는 것이 좋습니다. 이 구성은 문제를 영구적으로 resolve 위한 것이 아닙니다. 그러나 MSMQ가 실행 중인 경우 섹션의 단계를 수행할 수 있도록 이 구성을 사용하여 MSMQ 에 액세스할 수 있습니다.

3GB 스위치를 사용하여 Windows를 실행하도록 구성하는 방법에 대한 자세한 내용은 Windows 2000 도움말 파일 의 애플리케이션에서 애플리케이션 메모리 튜닝 지원 사용 항목을 참조하세요.

메시지를 수동으로 복구하려면

참고

  • MSMQ가 실행 중이 아닌 상태인 경우에만 다음 단계를 수행합니다.
  • MSMQ는 불안정한 상태이며 시작되지 않으므로 모든 메시지를 복구하지 못할 수 있습니다.

경고

이 프로세스로 인해 애플리케이션은 메시지가 원래 도착한 순서와 다른 순서로 트랜잭션 메시지를 받을 수 있습니다.

  1. 메시지 스토리지 파일을 저장할 임시 폴더를 만듭니다. MSMQ 폴더에 이 폴더를 배치하지 마세요.

  2. .mq 파일 이름 확장명이 있는 파일만 선택합니다.

    경고

    MSMQ Storage 폴더에 있는 일부 파일은 MSMQ를 올바르게 실행하는 데 중요합니다. .mq 파일 이름 확장명이 있는 파일만 선택해야 합니다.

  3. 선택한 파일을 1단계에서 만든 폴더로 이동합니다.

  4. MSMQ 데이터 액세스 드라이버가 시작되지 않았는지 확인합니다. 이렇게 하려면 명령 프롬프트에서 다음 명령을 실행합니다.

    Net Stop MQAC /y
    
  5. MSMQ 서비스를 시작합니다. 이렇게 하려면 명령 프롬프트에서 다음 명령을 실행합니다.

    Net Start MSMQ
    

    참고

    메시지의 데이터가 중요하지 않고 MSMQ를 다시 온라인 상태로 만들려는 경우 여기서 중지할 수 있습니다.

  6. 이제 서비스가 시작되는지 확인한 후 서비스를 중지합니다. 이렇게 하려면 명령 프롬프트에서 다음 명령을 실행합니다.

    Net Stop MQAC /y
    

    이 명령은 MSMQ 서비스와 데이터 액세스 드라이버를 모두 중지합니다.

  7. 5단계에서 메시지 스토리지 파일을 이동한 폴더에서 일부 파일 이름에는 p Number.mq 형식이 있고 일부 파일 이름은 lNumber.mq 형식입니다. 이러한 파일은 쌍으로 저장됩니다. 각 p 파일에는 해당 l 파일이 있습니다.

    파일이 수정된 날짜를 확인합니다. 가장 오래된 p 파일과 해당 l 파일을 선택합니다. 이러한 파일을 원래 MSMQ Storage 폴더로 이동합니다.

  8. 5단계에서 명령을 실행하여 MSMQ 서비스를 시작합니다. 서비스가 시작되면 MSMQ가 실행 중인 경우 섹션의 단계에 따라 메시지가 누적되는 큐와 메시지를 처리하는 방법을 확인합니다.

  9. 큐에서 누적 메시지를 제거한 후 MSMQ Storage 폴더에 모든 메시지 파일을 반환하고 큐에서 누적된 모든 메시지를 제거할 때까지 6~8단계를 반복합니다.

    참고

    1.6GB 이상의 데이터를 MSMQ Storage 폴더로 동시에 다시 이동하지 마세요. 이렇게 하면 서비스가 시작되지 않을 수 있습니다.

문제를 재현하는 방법

Windows 2000 Server를 실행하는 컴퓨터에서 메시지를 보내는 데 사용하는 애플리케이션이 0x00e0027 예외 오류를 받을 때까지 로컬 큐로 메시지를 보냅니다.

MSMQ 2.0은 메모리 매핑된 파일에 메시지를 저장합니다. Windows 2000 Server를 실행하는 컴퓨터에서 MSMQ 2.0에서 사용할 수 있는 할당된 메모리의 기본 크기는 2GB입니다. MSMQ 2.0의 구성 요소가 컴퓨터에 로드되면 MSMQ 2.0에서 사용할 수 있는 할당된 메모리 양이 약 1.6GB에서 1.8GB 사이로 줄어듭니다.

Boot.ini 파일에서 3GB 스위치를 사용하도록 설정하면 MSMQ 2.0에서 사용할 수 있는 할당된 메모리 양이 3GB로 증가합니다. MSMQ 2.0의 구성 요소가 컴퓨터에 로드되면 MSMQ 2.0에서 사용할 수 있는 할당된 메모리 양이 2.7GB로 줄어듭니다.

그러나 추가 할당된 메모리는 커널에서 약 1GB의 할당된 메모리를 사용합니다. 이 동작은 시스템 성능에 영향을 줄 수 있으며 파일 I/O를 수행하는 애플리케이션에 영향을 줄 수 있습니다.

MSMQ 2.0에서 사용할 수 있는 할당된 메모리의 양을 늘리기 위해서만 3GB 스위치를 사용하지 않는 것이 좋습니다. 대신 증상 섹션에 언급된 문제를 방지하기 위해 컴퓨터 할당량을 설정하는 것이 좋습니다.

자세한 내용은 Microsoft 메시지 큐에서 컴퓨터 할당량 및 큐 할당량을 설정하는 방법을 참조하세요.