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
źródło
Odpowiedzi:
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.
źródło
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.
źródło
Może to być związane z wyciekiem pamięci podłączonego sterownika serwera, zgodnie z wątkiem na forum :
źródło
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.
źródło
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ć.
źródło