Po zastosowaniu tej aktualizacji należy dodać flagę śledzenia — T8075 jako parametr uruchamiania, aby włączyć tę zmianę.
Symptomy
Po uruchomieniu zapytania w 64-bitowej wersji programu Microsoft SQL Server 2012 jest wyświetlany komunikat o błędzie informujący o braku pamięci, podobny do następującego w dzienniku błędów programu SQL Server:
Nie można przydzielić stron: FAIL_PAGE_ALLOCATION 513
Wykonywanie zapytań trwa długo i napotyka SOS_MEMORY_TOPLEVELBLOCKALLOCATOR czeka. Po zbadaniu poniższych punktów informacyjnych znajdziesz bardzo małą dostępną wirtualną przestrzeń adresową:
-
DBCC MEMORYSTATUS-liczba procesów/systemowych w sekcji — dostępna pamięć wirtualna
-
DMV: sys.dm_os_process_memory-Column virtual_address_space_available_kb
Te wartości rozpoczynają się około 8 terabajtów (TB) w procesie x64 i kontynuują poruszanie się po kilku gigabajtach (GB). Gdy znajdujesz się na etapie, w którym dostępna wirtualna przestrzeń adresowa jest bardzo niska, zapytania, które próbują wykonać przydział pamięci, mogą także napotkać typ oczekiwania CMEMTHREAD. Następujące punkty danych będą stale wzrastać:
-
DMV: sys.dm_os_process_memory i sys.dm_os_memory_nodes-Column virtual_address_space_reserved_kb
-
DBCC MEMORYSTATUS — sekcja Memory Manager — zarezerwowana maszyna wirtualna
Wartości te zwykle zwiększają się wielokrotności wartości "Max Server Memory" do niemal 8 TB.
Przyczyna
Gdy proces programu SQL Server osiągnął stan, w którym łączna pamięć serwera = pamięć serwera docelowego = Max pamięci serwera, w Menedżerze pamięci programu SQL Server są dostępne zasady pozwalające na tymczasowe wykonanie nowych przydziałów. Powtarzalny wzorzec przydziałów w takim stanie może powodować fragmentację bloków pamięci i zużycia wirtualnej przestrzeni adresowej. Jeśli ten proces powtarza się wielokrotnie, wirtualna przestrzeń adresowa programu SQL Server zostanie wyczerpana i pojawią się objawy wspomnianych wcześniej uwag.
Rozwiązanie
Informacje o aktualizacji zbiorczej
Ten problem został po raz pierwszy rozwiązany w poniższej zbiorczej aktualizacji programu SQL Server.
Każda nowa Zbiorcza aktualizacja programu SQL Server zawiera wszystkie poprawki i wszystkie poprawki zabezpieczeń uwzględnione w poprzedniej aktualizacji zbiorczej. Zalecamy pobranie i zainstalowanie najnowszych aktualizacji zbiorczych programu SQL Server:
Ta poprawka zapobiega za braku pamięci i ciągłej redukcji dostępnej wirtualnej przestrzeni adresowej, którą można napotkać.
Stan
Firma Microsoft potwierdziła, że jest to problem występujący w produktach firmy Microsoft wymienionych w sekcji "dotyczy".
Więcej informacji
-
System Windows 2012 R2 umożliwia powiększenie wirtualnej przestrzeni adresowej o rozmiarze do 128 TB. Z tego powodu nie można zauważyć tego problemu w środowiskach Windows 2012 R2. Aby uzyskać więcej informacji, zobacz następujący temat w centrum deweloperskim Windows:limity pamięci dla systemu Windows i wersji programu Windows Server
-
Jeśli po zastosowaniu tej poprawki widzisz ciągły wzrost przestrzeni adresowej, możesz określić, które zapytania lub operacje żądają dużych fragmentów pamięci za pomocą zdarzenia rozszerzonego page_allocated . Przykładowy skrypt wygląda następująco:
CREATE EVENT SESSION [memory_tracking] ON SERVERADD EVENT sqlos.page_allocated( ACTION(package0.callstack,sqlos.cpu_id,sqlos.task_address,sqlos.worker_address,sqlserver.database_id,sqlserver.query_hash,sqlserver.request_id,sqlserver.session_id,sqlserver.sql_text) WHERE ([number_pages]>(1)))ADD TARGET package0.event_file(SET filename=N'E:\Data\MSSQL11.MSSQLSERVER\MSSQL\Log\memory_tracking.xel')WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=PER_CPU,TRACK_CAUSALITY=OFF,STARTUP_STATE=OFF)GO
Zazwyczaj są to kopie zapasowe dziennika i operacje konserwacji indeksu, które występują często.