KB3074434 - PERBAIKI: Kesalahan kehabisan memori ketika ruang alamat virtual proses SQL Server sangat rendah pada memori yang tersedia

Berlaku Untuk
SQL Server 2012 Service Pack 3 SQL Server 2012 Developer SQL Server 2012 Enterprise SQL Server 2012 Enterprise Core SQL Server 2012 Standard

Setelah menerapkan pembaruan ini, Anda harus menambahkan bendera pelacakan -T8075 sebagai parameter pengaktifan untuk mengaktifkan perubahan ini.

Gejala

Ketika menjalankan kueri dalam versi 64-bit Microsoft SQL Server 2012, Anda menerima pesan kesalahan di luar memori yang menyerupai log kesalahan SQL Server:

Catatan

Gagal mengalokasikan halaman: FAIL_PAGE_ALLOCATION 513

Kueri memerlukan waktu lama untuk menyelesaikan eksekusi dan mengalami SOS_MEMORY_TOPLEVELBLOCKALLOCATOR menunggu.

Ketika Anda memeriksa poin-poin informasi berikut, Anda akan menemukan bahwa ruang alamat virtual yang tersedia sangat rendah:

  • DBCC MEMORYSTATUS - Bagian Jumlah Proses/Sistem - Memori Virtual yang Tersedia
  • DMV: sys.dm_os_process_memory - kolom virtual_address_space_available_kb

Nilai-nilai ini dimulai sekitar 8 terabyte (TB) pada proses x64 dan terus turun dan mencapai beberapa gigabyte (GB). 

Ketika Anda berada pada tahap di mana ruang alamat virtual yang tersedia sangat rendah, kueri yang mencoba melakukan alokasi memori mungkin juga mengalami tipe CMEMTHREAD tunggu.

Titik data berikut akan terus meningkat seiring waktu:

  • DMV: sys.dm_os_process_memory dan sys.dm_os_memory_nodes - kolom virtual_address_space_reserved_kb
  • DBCC MEMORYSTATUS - Bagian Pengelola Memori - VM Dicadangkan

Nilai ini biasanya akan meningkat dalam kelipatan nilai "memori server maks" hingga hampir 8 TB.

Penyebab

Ketika proses SQL Server telah mencapai kondisi di mana Total Memori Server = Memori Server Target = memori server maks, terdapat kebijakan di manajer memori SQL Server untuk mengizinkan alokasi baru meminta beberapa halaman 8 KB agar berhasil untuk sementara. Pola alokasi berulang dalam kondisi tersebut dapat menyebabkan fragmentasi blok memori dan konsumsi ruang alamat virtual. Jika proses ini berulang berkali-kali, ruang alamat virtual SQL Server akan habis, dan Anda akan melihat gejala yang disebutkan sebelumnya.

Resolusi

Informasi pembaruan kumulatif

Masalah pertama kali diperbaiki dalam pembaruan kumulatif SQL Server berikut.

Rekomendasi: Menginstal pembaruan kumulatif terbaru untuk SQL Server

Setiap pembaruan kumulatif baru untuk SQL Server berisi semua hotfix dan semua perbaikan keamanan yang disertakan dengan pembaruan kumulatif sebelumnya. Kami menyarankan Anda mengunduh dan menginstal pembaruan kumulatif terbaru untuk SQL Server:

Hotfix ini mencegah kehabisan memori dan pengurangan terus menerus ruang alamat virtual yang tersedia yang mungkin Anda alami.

Status

Microsoft telah mengonfirmasi bahwa ini adalah masalah dalam produk Microsoft sebagaimana tercantum di bagian "Berlaku untuk".

Informasi Selengkapnya

  • Windows 2012 R2 memungkinkan ruang alamat virtual tumbuh sebesar 128 TB. Oleh karena itu, Anda mungkin tidak melihat masalah ini di lingkungan Windows 2012 R2. Untuk informasi selengkapnya, lihat topik berikut di Pusat Pengembang Windows:

    Batas memori untuk rilis Windows dan Windows Server

  • Jika Anda melihat pertumbuhan berkelanjutan dalam ruang alamat virtual bahkan setelah menerapkan perbaikan, Anda dapat menentukan kueri atau operasi mana yang meminta sebagian besar memori menggunakan Page_allocated extended event. Contoh skrip terlihat seperti ini:

    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
    
    
    

    Biasanya, ini adalah pencadangan log dan operasi pemeliharaan indeks, yang sering terjadi.