KB3074434 — LABOJUMS: atmiņas trūkuma kļūda, ja SQL Server procesa virtuālajā adresē ir ļoti maz pieejamās atmiņas

Attiecas uz
SQL Server 2012 Service Pack 3 SQL Server 2012 Developer SQL Server 2012 Enterprise SQL Server 2012 Enterprise Core SQL Server 2012 Standard

Pēc šī atjauninājuma lietošanas ir jāpievieno izsekošanas karodziņš -T8075 kā startēšanas parametrs, lai iespējotu šīs izmaiņas.

Pazīmes

Izpildot vaicājumu Microsoft SQL Server 2012 64 bitu versijā, tiek parādīts kļūdas ziņojums par atmiņas pietrūkšanu, kas ir līdzīgs tālāk redzamajam SQL Server kļūdu žurnālā.

Piezīme

Neizdevās piešķirt lapas: FAIL_PAGE_ALLOCATION 513

Vaicājumu izpilde aizņem daudz laika, un SOS_MEMORY_TOPLEVELBLOCKALLOCATOR gaida.

Izpētot šos informācijas punktus, jūs atklāsiet, ka virtuālajā adresē ir ļoti maz pieejamās vietas:

  • DBCC MEMORYSTATUS — sadaļa Process/System Counts — pieejamā virtuālā atmiņa
  • DMV: sys.dm_os_process_memory - kolonna virtual_address_space_available_kb

Šīs vērtības x64 procesā sākas ar aptuveni 8 terabaitiem (TB) un turpina kāpt uz leju, sasniedzot dažus gigabaitus (GB). 

Kad virtuālās adreses vieta ir ļoti maza, vaicājumi, kas mēģina veikt atmiņas piešķiršanu, var saskarties arī ar gaidīšanas tipa CMEMTHREAD.

Tālāk norādīto datu punktu skaits laika gaitā turpinās pieaugt:

  • DMV: sys.dm_os_process_memory un sys.dm_os_memory_nodes - kolonna virtual_address_space_reserved_kb
  • DBCC MEMORYSTATUS - Atmiņas pārvaldnieka sadaļa - VM rezervēta

Šīs vērtības parasti palielinās līdz gandrīz 8 TB no vērtības "maksimālā servera atmiņa" lieluma.

Iemesls

Kad SQL Server process ir sasniedzis stāvokli, kad kopējā servera atmiņa = mērķa servera atmiņa = maksimālā servera atmiņa, SQL Server atmiņas pārvaldniekā ir politikas, kas ļauj jauniem piešķīrumiem pieprasīt vairākas 8 KB lapas, lai īslaicīgi izdotos. Atkārtots piešķiršanas modelis šādā gadījumā var izraisīt atmiņas bloku fragmentāciju un virtuālās adreses vietas patēriņu. Ja šis process atkārtojas daudzas reizes, SQL Server virtuālā adrešu telpa tiks izsmelta, un jūs pamanīsiet iepriekš minētos simptomus.

Risinājums

Kumulatīvā atjauninājuma informācija

Šī problēma pirmo reizi tika novērsta nākamajā SQL Server kumulatīvajā atjauninājumā.

Ieteikums: instalējiet jaunāko kumulatīvo atjauninājumu serverim SQL Server

Katrā jaunajā SQL Server kumulatīvajā atjauninājumā ir visi labojumfaili un visi drošības labojumi, kas bija iekļauti iepriekšējā kumulatīvajā atjauninājumā. Ieteicams lejupielādēt un instalēt jaunākos kumulatīvos SQL Server atjauninājumus:

Šis labojumfails novērš gan atmiņas pietrūkšanu, gan nepārtrauktu pieejamās virtuālās adreses vietas samazināšanu, ko jūs varētu rasties.

Statuss

Microsoft apstiprināja, ka šī ir problēma Microsoft produktos, kas norādīti sadaļā "attiecas uz".

Papildinformācija

  • Windows 2012 R2 ļauj virtuālās adreses telpas lielumam sasniegt pat 128 TB. Tāpēc, iespējams, nepamanīsit šo problēmu Windows 2012 R2 vidēs. Papildinformāciju skatiet Windows izstrādātāju centrā šajā tēmā:

    Atmiņas ierobežojumi Windows un Windows Server laidieniem

  • Ja redzat nepārtrauktu virtuālās adrešu telpas pieaugumu pat pēc labojuma lietošanas, varat noteikt, kuri vaicājumi vai operācijas pieprasa lielus atmiņas gabalus, izmantojot Page_allocated paplašināto notikumu. Skripta paraugs izskatās šādi:

    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
    
    
    

    Parasti tās ir žurnālu dublējumi un indeksa uzturēšanas darbības, kas notiek bieži.