Błąd, gdy pamięć RAM używana do przechowywania komunikatów w usłudze Kolejkowanie komunikatów 2.0 przekracza przydzieloną pamięć

Ten artykuł zawiera pomoc w rozwiązaniu problemu występującego, gdy ilość pamięci RAM używanej do przechowywania komunikatów w usłudze Kolejkowanie komunikatów firmy Microsoft 2.0 (MSMQ 2.0) przekracza przydzieloną pamięć.

Oryginalna wersja produktu: Kolejkowanie komunikatów firmy Microsoft
Oryginalny numer KB: 899613

Symptomy

Podczas wysyłania komunikatu do kolejki usługa MSMQ nie akceptuje wysyłanej wiadomości. Zamiast tego usługa MSMQ generuje komunikat o błędzie niewystarczającej liczby zasobów . Ten komunikat o błędzie jest wyświetlany w aplikacji, która wysyła komunikaty przy użyciu programu MSMQ 2.0.

W przypadku wystąpienia tego problemu w śladzie stosu usługi lub aplikacji .NET Framework mogą pojawić się następujące informacje:

Typ wyjątku: System.Messaging.MessageQueueException
MessageQueueErrorCode: InsufficientResources
Komunikat: Niewystarczające zasoby do wykonania operacji.
ErrorCode: -2147467259
TargetSite: Void SendInternal(System.Object, System.Messaging.MessageQueueTransaction, System.Messaging.MessageQueueTransactionType)
HelpLink: NULL
Źródło: System.Messaging

Ponadto powyższy komunikat jest zalogowany w dzienniku aplikacji. W aplikacji COM+ Queued Component (QC) powyższy komunikat może zostać zarejestrowany w dzienniku aplikacji. Ten problem występuje, gdy spełnione są następujące warunki:

  • Próbujesz wysłać wiadomość w usłudze MSMQ.

  • Przydzielona pamięć, która jest obecnie używana do uruchamiania usługi i przechowywania komunikatów, osiągnęła 2 gigabajty (GB). Domyślnie system Windows 2000 przydziela 2 GB pamięci adresowalnej do procesu.

    Po załadowaniu usługi MSMQ domyślna ilość przydzielonej pamięci dostępnej dla programu MSMQ 2.0 do przechowywania komunikatów wynosi od 1,6 GB do 1,8 GB.

    Uwaga

    Jeśli używasz przełącznika 3 GB, przydzielona pamięć będzie wynosić od 2 GB do 2,5 GB.

    Pliki magazynu komunikatów są plikami mapowanymi na pamięć. W związku z tym możesz sprawdzić, czy limit został przekroczony, sprawdzając rozmiar folderu MSMQ Storage. Ten folder zazwyczaj znajduje się w folderze %WinDir%\System32\MSMQ Storage. Jednak folder magazynu można skonfigurować dla innej lokalizacji. Aby sprawdzić, czy folder magazynu został skonfigurowany dla innej lokalizacji, zobacz pole Folder plików komunikatów na karcie Magazyn w narzędziu MSMQ w Panel sterowania.

Przyczyna

Ten problem występuje z co najmniej jednej z następujących przyczyn:

  • Aplikacja, która odczytuje i przetwarza komunikaty docierające do kolejek, ma trudności. Jednak komunikaty nadal docierają do kolejek szybciej niż szybkość, z jaką aplikacja może odczytywać i przetwarzać komunikaty.

  • Dzienniki są włączone w kolejkach. Jednak dane, które powodują gromadzenie komunikatów, nie zostały usunięte.

  • Usługa Deadlettering jest włączona w kolejkach. Ponadto osiągnięto lub przekroczono ilość przydzielonej pamięci dostępnej do przechowywania komunikatów utraconych.

  • Komunikaty zostały zgromadzone w kolejce wychodzącej, ponieważ kolejka docelowa jest niedostępna.

Rozwiązanie

Metoda używana do rozwiązania tego problemu zależy od bieżącego stanu usługi MSMQ. Aby można było rozwiązać ten problem, należy zatrzymać usługi lub aplikacje, które zapisują się w kolejkach.

Jeśli narzędzie MSMQ jest uruchomione

Określ, które kolejki mają skumulowane komunikaty. Aby to zrobić, użyj jednej z następujących metod:

  • Ręcznie sprawdź kolejki przy użyciu interfejsu MSMQ. Interfejs MSMQ znajduje się w konsoli zarządzania komputerem.

  • W monitor wydajności ustaw wszystkie liczniki obiektu wydajności KOLEJKI MSMQ. Następnie wybierz pozycję Widok raportu . W widoku Raport można zobaczyć liczbę komunikatów w każdej kolejce.

Po określeniu, które kolejki mają skumulowane komunikaty, musisz określić, dlaczego komunikaty się zgromadziły. Istnieje kilka możliwych powodów, dla których komunikaty mogą gromadzić się w kolejkach. Te przyczyny obejmują następujące kwestie:

  • Komunikaty znajdujące się w kolejce komunikatów wychodzących nie mogą dotrzeć do ich miejsc docelowych. Jeśli komunikaty nie mogą dotrzeć do miejsc docelowych, upewnij się, że komputer docelowy jest dostępny do odbierania komunikatów. Jeśli te komunikaty są nieaktualne lub nie mają żadnej wartości, wyczyść kolejkę.

  • Aplikacja, która powinna odbierać komunikaty, została zatrzymana lub została wprowadzona warunek błędu. Jeśli jeden z tych warunków jest spełniony, rozwiąż problem w tej aplikacji.

  • Komunikaty w kolejkach utraconych wiadomości lub w kolejkach dziennika zostały zachowane. Te komunikaty nie zostały usunięte ani przetworzone. Jeśli te komunikaty zostały zachowane, określ cel przechowywania tych komunikatów. Opcja dziennika komunikatów jest często używana do testowania.

Po zakończeniu testowania ta opcja może zostać przypadkowo włączona. Jeśli komunikaty są nieaktywne, komunikaty nie zostały przetworzone ani dostarczone w określonym czasie. Jeśli włączono listę utraconych wiadomości lub dzienników, proces powinien odczytywać te komunikaty z kolejki. Po zidentyfikowaniu kolejek, w których nagromadzono komunikaty, można usunąć skumulowane komunikaty.

Jeśli narzędzie MSMQ nie jest uruchomione i nie można go uruchomić ręcznie

Uwaga

  • Przed wprowadzeniem jakichkolwiek zmian w plikach w folderze MSMQ Storage zalecamy utworzenie kopii zapasowej bieżącego środowiska MSMQ przy użyciu MQbkup.exe. Ten krok jest bardzo ważny, jeśli potrzebujesz pomocy z usług pomocy technicznej produktu.

  • Ponieważ narzędzie MSMQ wprowadziło niestabilny stan, może nie być możliwe odzyskanie wszystkich komunikatów. Jeśli wystąpią trudności z przywracaniem komunikatów, wykonując następujące kroki, a dane są bardzo ważne, skontaktuj się z usługami pomocy technicznej produktu, aby uzyskać pomoc.

Aby utworzyć kopię zapasową konfiguracji programu MSMQ przy użyciu MQbkup.exe, wykonaj następujące kroki.

Uwaga

Przed uruchomieniem MQbkup.exe wybierz folder, w którym zostaną utworzone kopie zapasowe plików MSMQ. Ten folder musi znajdować się na dysku, który ma co najmniej 2,5 GB dostępnego miejsca.

  1. Otwórz okno wiersza polecenia.

  2. Zmień katalog na %WinDir%\System32.

  3. Uruchom polecenie:

    MQbkup.exe -b Drive :\ Folder to Put Backup Files
    
  4. Zanotuj lokalizację folderu, w którym utworzono kopię zapasową plików MSMQ.

Uruchamianie serwera przy użyciu przełącznika 3 GB

Uwaga

Przełącznik 3 GB jest tylko opcją dla systemu Windows 2000 Advanced Server. W przypadku systemu Windows 2000 Server i windows 2000 Professional przejdź do sekcji Aby ręcznie odzyskać komunikaty .

Domyślnie system Windows 2000 przydziela 2 GB pamięci adresowalnej do każdego procesu. Ten problem występuje, ponieważ usługa MSMQ używa całej alokacji. To zachowanie uniemożliwia prawidłowe ponowne uruchomienie usługi. Jeśli używasz przełącznika 3 GB, system Windows 2000 Advanced Server przydziela 3 GB pamięci adresowalnej do każdego procesu. Ta konfiguracja zapewnia pamięci adresowalnej MSMQ wystarczającej do załadowania usługi i plików magazynu komunikatów po ponownym uruchomieniu serwera. Ten przełącznik zwiększa rozmiar magazynu MSMQ do 2 GB do 2,5 GB.

Ostrzeżenie

Ta konfiguracja może mieć wpływ na inne zasoby na serwerze. Zalecamy usunięcie przełącznika o pojemności 3 GB po zakończeniu rozwiązywania problemów. Ta konfiguracja nie ma na celu trwałego rozwiązania problemu. Można jednak użyć tej konfiguracji, aby uzyskać dostęp do usługi MSMQ, aby można było wykonać kroki opisane w sekcji If MSMQ is running (Jeśli narzędzie MSMQ jest uruchomione ).

Aby uzyskać więcej informacji na temat konfigurowania systemu Windows do uruchamiania przy użyciu przełącznika 3 GB, zobacz temat Włączanie obsługi dostrajania pamięci aplikacji w aplikacjach w pliku Pomocy systemu Windows 2000.

Aby ręcznie odzyskać komunikaty

Uwaga

  • Wykonaj te kroki tylko wtedy, gdy msmq jest w stanie nie działa.
  • Ponieważ narzędzie MSMQ jest w stanie niestabilnym i nie zostanie uruchomione, może nie być możliwe odzyskanie wszystkich komunikatów.

Ostrzeżenie

Ten proces może spowodować, że aplikacja będzie odbierać komunikaty transakcyjne w innej kolejności niż kolejność, w której pierwotnie dotarły komunikaty.

  1. Utwórz folder tymczasowy do przechowywania plików magazynu komunikatów. Nie umieszczaj tego folderu w folderze MSMQ.

  2. Wybierz tylko pliki, które mają rozszerzenie nazwy pliku mq .

    Ostrzeżenie

    Niektóre pliki znajdujące się w folderze MSMQ Storage mają krytyczne znaczenie dla poprawnego uruchamiania programu MSMQ. Upewnij się, że wybrano tylko pliki z rozszerzeniem nazwy pliku mq .

  3. Przenieś wybrane pliki do folderu utworzonego w kroku 1.

  4. Upewnij się, że sterownik dostępu do danych MSMQ nie został uruchomiony. W tym celu uruchom następujące polecenie w wierszu polecenia:

    Net Stop MQAC /y
    
  5. Uruchom usługę MSMQ. W tym celu uruchom następujące polecenie w wierszu polecenia:

    Net Start MSMQ
    

    Uwaga

    Jeśli dane w komunikatach nie są ważne i chcesz tylko przywrócić usługę MSMQ do trybu online, możesz zatrzymać się tutaj.

  6. Po zweryfikowaniu, że usługa zostanie uruchomiona, zatrzymaj usługę. W tym celu uruchom następujące polecenie w wierszu polecenia:

    Net Stop MQAC /y
    

    To polecenie zatrzymuje zarówno usługę MSMQ, jak i sterownik dostępu do danych.

  7. W folderze, do którego przeniesiono pliki magazynu komunikatów w kroku 5, zwróć uwagę, że niektóre nazwy plików mają format pNumber.mq, a niektóre nazwy plików mają format lNumber.mq. Te pliki są przechowywane jako pary. Każdy plik p ma odpowiedni plik l .

    Zwróć uwagę na daty modyfikacji plików. Wybierz najstarszy plik p i odpowiedni plik l . Przenieś te pliki do oryginalnego folderu MSMQ Storage.

  8. Uruchom polecenie w kroku 5, aby uruchomić usługę MSMQ. Jeśli usługa zostanie uruchomiona, wykonaj kroki opisane w sekcji If MSMQ is running (Jeśli narzędzie MSMQ jest uruchomione ), aby określić, w których kolejkach są gromadzone komunikaty i jak obsługiwać komunikaty.

  9. Po usunięciu skumulowanych komunikatów z kolejek powtórz kroki od 6 do 8 do momentu zwrócenia wszystkich plików komunikatów do folderu MSMQ Storage i usunięcia wszystkich skumulowanych komunikatów z kolejek.

    Uwaga

    Nie należy jednocześnie przenosić więcej niż 1,6 GB danych do folderu MSMQ Storage. Jeśli to zrobisz, usługa może nie zostać uruchomiona.

Kroki prowadzące do odtworzenia problemu

Na komputerze z systemem Windows 2000 Server wysyłaj komunikaty do kolejki lokalnej, dopóki aplikacja używana do wysyłania komunikatów nie otrzyma błędu wyjątku 0x00e0027 .

Program MSMQ 2.0 przechowuje komunikaty w plikach zamapowanych na pamięć. Na komputerze z systemem Windows 2000 Server domyślna ilość przydzielonej pamięci dostępnej dla programu MSMQ 2.0 wynosi 2 GB. Po załadowaniu składników programu MSMQ 2.0 na komputer ilość przydzielonej pamięci dostępnej dla programu MSMQ 2.0 jest zmniejszona do około 1,6 GB do 1,8 GB.

Jeśli włączysz przełącznik 3 GB w pliku Boot.ini , ilość przydzielonej pamięci dostępnej dla programu MSMQ 2.0 wzrośnie do 3 GB. Po załadowaniu składników programu MSMQ 2.0 na komputer ilość przydzielonej pamięci dostępnej dla programu MSMQ 2.0 zostanie zmniejszona do 2,7 GB.

Jednak dodatkowa przydzielona pamięć pobiera również około 1 GB przydzielonej pamięci z jądra. To zachowanie może mieć wpływ na wydajność systemu i może mieć wpływ na aplikacje, które wykonują operacje we/wy plików.

Nie zaleca się używania przełącznika 3 GB tylko w celu zwiększenia ilości przydzielonej pamięci dostępnej dla programu MSMQ 2.0. Zamiast tego zalecamy skonfigurowanie limitu przydziału komputera, aby zapobiec problemowi wymienionemu w sekcji Objawy .

Aby uzyskać więcej informacji, zobacz How to set up computer quotas and queue quotas in Microsoft Message Queuing (Jak skonfigurować przydziały komputerów i limity przydziału kolejek w usłudze Kolejkowanie komunikatów firmy Microsoft).