KB3074434 – OPRAVA: Chyba nedostatku pamäte, keď virtuálny priestor adries procesu SQL Server má veľmi málo dostupnej pamäte

Vzťahuje sa na
SQL Server 2012 Service Pack 3 SQL Server 2012 Developer SQL Server 2012 Enterprise SQL Server 2012 Enterprise Core SQL Server 2012 Standard

Ak chcete povoliť túto zmenu, po použití tejto aktualizácie je potrebné pridať príznak trasovania -T8075 ako počiatočný parameter.

Príznaky

Pri spustení dotazu v 64-bitovej verzii Microsoft SQL Server 2012 sa zobrazí chybové hlásenie o nedostatku pamäti, ktoré je podobné nasledujúcemu v denníku chýb SQL Server:

Poznámka

Nepodarilo sa prideliť strany: FAIL_PAGE_ALLOCATION 513

Dokončenie dotazov trvá dlho, kým sa dokončí, a stretávajú sa s SOS_MEMORY_TOPLEVELBLOCKALLOCATOR čakaním.

Po preskúmaní nasledujúcich informačných bodov zistíte, že virtuálneho miesta adries je veľmi málo:

  • DBCC MEMORYSTATUS – časť Počty procesov/systémov – Dostupná virtuálna pamäť
  • DMV: sys.dm_os_process_memory – stĺpec virtual_address_space_available_kb

Tieto hodnoty začínajú okolo 8 terabajtov (TB) v procese x64 a naďalej klesajú a dosahujú niekoľko gigabajtov (GB). 

Keď sa nachádzate vo fáze, keď je dostupný virtuálny priestor veľmi nízky, dotazy, ktoré sa pokúšajú vykonať vyhradenie pamäte, sa tiež môžu stretnúť s typom čakania CMEMTHREAD.

Počet nasledujúcich údajových bodov sa bude postupne zväčšovať:

  • DMV: sys.dm_os_process_memory a sys.dm_os_memory_nodes – stĺpec virtual_address_space_reserved_kb
  • DBCC MEMORYSTATUS - sekcia Správca pamäte - VM vyhradené

Tieto hodnoty sa zvyčajne v násobkoch hodnoty "maximálna pamäť servera" zvýšia až na takmer 8 TB.

Príčina

Keď proces SQL Server dosiahne stav, keď celková pamäť servera = pamäť cieľového servera = maximálna pamäť servera, existujú politiky v správcovi pamäte SQL Server, ktoré umožnia novým vyhradeniam dočasne úspešne požadovať viacero 8 kB stránok. Opakovaný vzor prideľovania za takýchto podmienok môže spôsobiť fragmentáciu pamäťových blokov a spotrebu virtuálneho priestoru adries. Ak sa tento proces zopakuje veľakrát, virtuálny priestor adries SQL Server sa vyčerpá a všimnete si príznaky, ktoré boli uvedené vyššie.

Riešenie

Informácie o kumulatívnych aktualizáciách

Tento problém bol prvýkrát opravený v nasledujúcej kumulatívnej aktualizácii SQL Server.

Odporúčanie: Nainštalujte najnovšiu kumulatívnu aktualizáciu pre SQL Server

Každá nová kumulatívna aktualizácia pre SQL Server obsahuje všetky rýchle opravy a opravy zabezpečenia, ktoré boli zahrnuté v predchádzajúcej kumulatívnej aktualizácii. Odporúčame stiahnuť a nainštalovať najnovšie kumulatívne aktualizácie pre SQL Server:

Táto rýchla oprava zabraňuje nedostatku pamäte a neustálemu zmenšovaniu dostupného virtuálneho priestoru adries, ktoré sa môže vyskytnúť.

Stav

Spoločnosť Microsoft potvrdila, že ide o problém v produktoch spoločnosti Microsoft, ktoré sú uvedené v časti Vzťahuje sa na.

Ďalšie informácie

  • Windows 2012 R2 umožňuje, aby virtuálny adresný priestor narástol až na 128 TB. Preto tento problém nemusíte pozorovať v prostrediach systému Windows 2012 R2. Ďalšie informácie nájdete v nasledujúcej téme na lokalite Windows Dev Center:

    Limity pamäte pre vydania systémov Windows a Windows Server

  • Ak aj po použití opravy pozorujete nepretržitý nárast virtuálneho priestoru adries, môžete pomocou udalosti Page_allocated extended určiť, ktoré dotazy alebo operácie požadujú veľké bloky pamäte. Vzorový skript vyzerá takto:

    CREATE EVENT SESSION [memory_tracking] ON SERVER
    ADD 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
    
    
    

    Zvyčajne ide o zálohovanie denníka a operácie údržby indexu, ktoré sa vyskytujú často.