SQL Server 2005: Brak wystarczającej pamięci systemowej do uruchomienia tego zapytania

13

Jeden z naszych serwerów SQL, działający stabilnie od dłuższego czasu (lat), ostatnio generuje niewystarczające błędy pamięci. Z dziennika zdarzeń aplikacji widzimy:

Identyfikator zdarzenia: 701

Opis: brak pamięci systemowej do uruchomienia tego zapytania.

Nasz zespół zarządzający tym serwerem składa się głównie z programistów, którzy podwajają obowiązki administratora. Jednak naszą podstawową wiedzą specjalistyczną jest rozwój. Biorąc to pod uwagę, nie wiemy, jak rozwiązać ten problem. Przeszukaliśmy fora i inne podobne rzeczy i nie znaleźliśmy nic pasującego

Oto kilka dodatkowych szczegółów pomocnych w rozwiązywaniu problemów:

  • Nasza minimalna pamięć serwera jest ustawiona na 0.
  • Nasza maksymalna pamięć serwera jest ustawiona na 2000.
  • Całkowita pamięć fizyczna wynosi 3335,85 MB (z sysinfo).
  • Całkowita pamięć wirtualna to 7,10 GB (z sysinfo).
  • Nie używaliśmy AWE do przydzielania pamięci, ale teraz zobaczymy, czy to robi różnicę.
  • Ten błąd został zgłoszony przez zadanie, które tworzyło kopię zapasową dziennika transakcji, nie uruchamiając zapytania.
  • Mamy wiele połączonych serwerów. Typy RDBMS po drugiej stronie to systemy SQL Server (2005 i 2000), Oracle 10g i OSI PI.
  • W tym momencie jest przerywany. Wydaje się, że nie możemy korelować czasu ani zdarzenia z błędami.
  • Oczywiście ponowne uruchomienie wydaje się sprawić, że zniknie na chwilę, co ma sens ze względu na naturę komunikatu o błędzie.
  • Serwer ten działa jako serwer aplikacji (kilka usług systemu Windows) i serwer WWW, a także serwer bazy danych.

EDYTOWAĆ:

Jesteśmy na SP3. Większość postów, które znaleźliśmy, było wcześniejszych niż SP1, co nie dotyczy nas.

SELECT  SERVERPROPERTY('productversion'), SERVERPROPERTY ('productlevel'), SERVERPROPERTY ('edition')

zwroty

9.00.4035.00 SP3 Edycja standardowa

Aaron Daniels
źródło
Czy możesz przejrzeć dziennik błędów programu SQL Server, ponieważ mogą istnieć dodatkowe szczegóły dotyczące tego błędu.
John Sansom

Odpowiedzi:

4

Sugerowałbym również użycie parametru startowego -g. Wydaje się, że działa dla większości ludzi i prawdopodobnie również dla ciebie. Moją jedyną obawą jest to, że podstawowy problem może nie zostać rozwiązany. Na przykład, jeśli nastąpi wyciek pamięci z powodu połączonego serwera, a MTL zostanie zwiększony do 512 Mb, czy będzie to tylko dłuższy okres między problemami z pamięcią? Nie znam odpowiedzi na to pytanie, ale zazwyczaj zgadzam się z UndertheFold, że perfmon może być dobrym początkiem.

Mike Thien
źródło
7

Komunikat o błędzie „Za mało pamięci systemowej do uruchomienia tego zapytania”. odnosi się do niedostępności wirtualnej przestrzeni adresowej (VAS), a nie pamięci w konwencjonalnym sensie, tj. w przestrzeni procesu SQL Server.

Biorąc pod uwagę, że korzystasz tylko z 3 GB na tym serwerze, a SQL Server został przypisany do 2 GB, oznacza to, że system operacyjny, a co ważniejsze, wszystko inne na pudełku ma mniej niż 1 GB do gry. To nie jest dużo pamięci.

Jeśli ten problem jest rzeczywiście wynikiem wycieku pamięci, wówczas wykorzystuje się VAS poza przestrzenią procesową SQL Server (memToLeave).

Sugerowałbym użycie parametru startowego -g do przypisania większej ilości pamięci do części memToLeave.

Więcej informacji znajduje się w następującym artykule:

http://www.johnsansom.com/sql-server-memory-configuration-determining-memtoleave-settings/

Możesz również zmniejszyć ustawienie maksymalnej pamięci SQL Server, ale zrobiłbym to w ostateczności.

John Sansom
źródło
Dobry artykuł. Dziękujemy za napisanie tego również! Mamy kilka wyładowań AppDomains w naszych logach SQL. Mamy tylko 2 procedury składowane CLR, które w zasadzie tylko pobierają i umieszczają dane w / z usługi internetowej. Wydaje się dziwne, że te 2 procedury składowane CLR zużywałyby zbyt dużo VAS po wyjęciu z pudełka.
Aaron Daniels
Nie ma za co. Jak zapewne wiesz, domyślny przydział memToLeave to tylko 256 MB. Jest to dość mały obszar izolowany dla domen AppDomains, całego kodu CLR / zarządzanego, zapytań na serwerze połączonym, SSIS itp., Zwłaszcza jeśli używasz całej dostępnej pamięci na serwerze. Sugerowałbym podwojenie go do 512 MB przy użyciu parametru startowego -g.
John Sansom
1

Może to być związane z wyciekiem pamięci podłączonego sterownika serwera, zgodnie z wątkiem na forum :

Oto, co powiedział nam Microsoft.

Najwyraźniej przetwarzanie danych przy użyciu połączonego serwera, a konkretnie sterownik fox pro powoduje wyciek pamięci, który narasta z czasem.

splattne
źródło
0

Serwer ten działa jako serwer aplikacji (kilka usług systemu Windows) i serwer WWW, a także serwer bazy danych.

Ustawiłbym twoją minimalną pamięć - całkiem możliwe, że te inne procesy „kradną” pamięć SQL

Możesz uruchomić dziennik liczników za pomocą perfmon, aby to potwierdzić i / lub dać sobie więcej informacji, aby zidentyfikować prawdziwy problem.

CPU_BUSY
źródło
0

Referencje zaczerpnięte z tego bloga!

Istnieją różne alternatywy rozwiązania tego problemu.

Najpierw sprawdź ustawienia SQL Server dla „minimalnej pamięci serwera” i „maksymalnej pamięci serwera”. Jeśli zauważysz bardzo małą różnicę w obu wartościach, zwiększ swoją „maksymalną pamięć serwera”.

Po drugie, znaleziono długo działające zapytania z informacjami o zużyciu pamięci, a jeśli to zapytanie w stanie bezczynności, sprawdź i zabij ten proces. Optymalizacja wydajności bazy danych jest bardzo ważna dla wykorzystania pamięci.

Po trzecie, odkryłem zastosowania indeksu dla długich zapytań, ponieważ bez odpowiedniego indeksowania systemowego przyrostu We / Wy DISK i jego bezpośredniego wpływu na pamięć.

Po czwarte, sprawdź rozmiar pliku stronicowania pamięci wirtualnej i zwiększ rozmiar tego pliku.

Po piąte, sprawdź rozmiar „minimalnej pamięci na zapytanie”, tak naprawdę jest to domyślnie 1024 KB, ale w rzadkich sytuacjach możesz zmniejszyć rozmiar tego parametru. W rzeczywistości nie jest to wskazane, ale możesz spróbować.

Po szóste, spróbuj wykonać to polecenie DBCC i ponownie nie jest to zalecane, ponieważ może to wpłynąć na ogólną wydajność serwera. Ale możesz spróbować.

Anvesh
źródło