Masalah kehabisan memori pada SQL Server 2012 SP3


8

Saya telah mengalami kesalahan SQL Server OOM secara berkala, satu kali ke titik bahwa SQL Server dimatikan sendiri dan selalu terjadi pada malam hari, ketika tidak ada yang menggunakannya, dan tidak ada pekerjaan SQL Agent yang berjalan pada saat itu:

Inilah kesalahan tipikal:

08/17/2017 19: 31: 17, spid100, Tidak Dikenal, Ada memori sistem yang tidak mencukupi di kumpulan sumber daya 'internal' untuk menjalankan kueri ini.

17/08/2017 19: 31: 17, spid100, Tidak Dikenal, Kesalahan: 701 Tingkat Permasalahan: 17 Negara: 123.

17/08/2017 19: 31: 17, spid112, Tidak Dikenal, Kesalahan: 18056 Tingkat Permasalahan: 20 Negara: 29. (Params :). Kesalahan dicetak dalam mode singkat karena ada kesalahan selama pemformatan. Melacak notifikasi ETW dll dilewati.

Ini info servernya:

  • Memori server SQL MIN 10GB
  • Memori server SQL 21GB MAX
  • hanya 4 DB di server
  • ukurannya masing-masing hanya 1 hingga 2 GB
  • Ukuran Tempdb tidak pernah tumbuh hingga lebih dari 1GB (diatur ke tumbuh otomatis menjadi 10GB)
  • Semua indeks adalah frag yang rendah, statistik diperbarui
  • Versi: kapan:

    Microsoft SQL Server 2012 (SP3) (KB3072779) - 11.0.6020.0 (X64) 
        Oct 20 2015 15:36:27 
        Copyright (c) Microsoft Corporation
        Standard Edition (64-bit) on Windows NT 6.3 <X64> (Build 9600: ) (Hypervisor)

Saya memeriksa beberapa item:

  • Status memori DBCC
  • Statistik cepat:

    SELECT (physical_memory_in_use_kb/1024)/1024 AS [PhysicalMemInUseGB]
    FROM sys.dm_os_process_memory;
    GO
    
    Output:
    20 GB
    Page Life Expectancy                     155932
  • Tidak ada gubernur sumber daya diaktifkan:

    select pool_id, cache_memory_kb, used_memory_kb,
           out_of_memory_count,used_memgrant_kb
      from sys.dm_resource_governor_resource_pools
    
    Output:
    
    pool_id | cache_memory_kb | used_memory_kb | out_of_memory_count | used_memgrant_kb
    --------+-----------------+----------------+---------------------+-----------------
          1 |          295368 |         641416 |                   0 |                0
    
    
    select (physical_memory_in_use_kb/1024) Memory_usedby_Sqlserver_MB,
           (locked_page_allocations_kb/1024) Locked_pages_used_Sqlserver_MB,
           (total_virtual_address_space_kb/1024 )Total_VAS_in_MB,
           process_physical_memory_low,
           process_virtual_memory_low
      from sys. dm_os_process_memory
    
    Output:
    
    Memory_usedby_Sqlserver_MB | Locked_pages_used_Sqlserver_MB | Total_VAS_in_MB | process_physical_memory_low | process_virtual_memory_low
    ----------------------------------------------------------------------------------------------------------------------------------------
                         20553 |                          20393 |       134217727 |                           0 |                          0

Server pada SP3, saya tahu ada masalah kebocoran memori di SP1, jadi mengesampingkan itu.

Adakah yang melihat sesuatu dalam hasil DBCC yang harus saya fokuskan?


1
Apakah ada layanan / aplikasi lain yang dihosting di server ini? Apakah akun SQL Server Service bagian dari Halaman Terkunci dalam Kebijakan Keamanan Lokal Memori? Apakah Windows Event Logs menunjukkan masalah lain di sekitar waktu Anda mengalami kerusakan SQL Server?
John Eisbrener

-Tidak ada aplikasi lain yang di-host di server ini, ini adalah server SQL khusus. Akun layanan server -SQL adalah bagian dari grup admin windows. - Saya baru saja melihat banyak kesalahan VSS: Volume Shadow Copy Service error: Permintaan kesalahan tak terduga untuk antarmuka IVssWriterCallback. jam = 0x80070005, Akses ditolak. . Ini sering disebabkan oleh pengaturan keamanan yang salah dalam proses penulis atau pemohon. Operasi: Mengumpulkan Data Penulis Konteks: Kelas Penulis Id: {35e81631-13e1-48db-97fc-d5bc721bb18a} Nama Penulis: NPS VSS Writer Writer ID Instans: {...}
user132852

1
Apakah server itu VM? Jika demikian, apakah ia memiliki sumber daya memori "khusus" atau apakah ia berbagi dengan VM lain? Dan, jika berbagi memori, apakah distribusi sumber daya memori terlalu dikomit? Saya telah melihat ini terjadi (terlepas dari versi) pada server VM di mana memori dialokasikan lebih.
SQL_Hacker

3
Terima kasih Shanky. Hanya untuk memperbarui, saya menemukan masalah Jumat lalu setelah menambahkannya ke pemantauan, tampaknya salah satu sesi pemantauan aplikasi dalam aplikasi (pihak ketiga) tidak dikonfigurasi dengan benar, sesi koneksi tidak ditutup hingga beberapa jam kemudian ketika OOM bunuh itu.
user132852

1
@ user132852 Anda dapat memberikan solusi Anda dan menandainya dijawab.
Thomas Kronawitter

Jawaban:


2

Karena SQL Server berjalan di VM, seperti yang ditunjukkan oleh (hypervisor)indikator dalam pernyataan versi, Anda harus memastikan memiliki reservasi memori di VMWare (atau Hyper-V, dll) di server host.

Reservasi memori biasanya 100% dari memori yang dialokasikan untuk VM untuk mesin virtual SQL Server yang digunakan dalam lingkungan produksi. Tanpa reservasi memori, server host dapat "mencuri" memori dari mesin virtual melalui penggunaan "driver balon" untuk digunakan oleh beberapa VM lain, yang kemungkinan merupakan penyebab kondisi kehabisan memori Anda.

Di VMWare vCenter, untuk mengatur Pemesanan Memori di Mesin Virtual:

  1. Matikan mesin virtual sebelum mengkonfigurasi pengaturan memori.

  2. Di vSphere Client, klik kanan mesin virtual dari inventaris dan pilih Edit Pengaturan.

  3. Di jendela Properti Mesin Virtual, pilih tab Sumber Daya dan pilih Memori.

  4. Di panel Alokasi Sumber Daya, pilih kotak centang Cadangan semua memori tamu (Semua terkunci).

  5. Klik OK.

Jika Anda menggunakan Microsoft Hyper-V, nonaktifkan memori dinamis untuk VM, menggunakan proses ini di Hyper-V Manager:

  1. Pastikan VM dimatikan.
  2. Klik kanan-atas VM, pilih "Pengaturan"
  3. Pilih "Memori" dari panel kiri.
  4. Pastikan "Aktifkan Memori Dinamis" tidak dicentang.
  5. Mulai VM.

1

Beberapa perubahan konfigurasi yang akan saya buat:

  1. Hapus pengaturan memori minimum, secara harfiah tidak perlu untuk ini.
    • Alasan Anda ingin mengubah ini adalah karena jika ini diatur, SQL Server tidak akan pernah melepaskan memori di bawah tanda. Jika halaman terkunci dalam memori, memori tidak lagi dapat dipetakan.
  2. Sesuaikan memori terputus maksimum menjadi 75% dari total untuk total <32gb atau 87,5% untuk total> 32gb.
    • Dengan asumsi SQL Server adalah satu-satunya yang berjalan pada mesin, biarkan ia mengkonsumsi memori apa pun yang tersisa setelah memberikan OS memori yang cukup untuk beroperasi dengan baik.

Anda dapat menggunakan skrip berikut untuk mencapai ini:

use master;
go

-- MIN Server Memory
exec sys.sp_configure
    'min server memory (MB)'
    ,0;

-- MAX Server Memory
declare
  @systemMemory int
  ,@maxServerMemory int;

select
  @systemMemory = total_physical_memory_kb / 1024
from
  sys.dm_os_sys_memory;

set @maxServerMemory = floor(@systemMemory * .75);

if @systemMemory >= 32768
  begin
    set @maxServerMemory = floor(@systemMemory * .875);
  end;

exec sys.sp_configure
  'max server memory (MB)'
  ,@maxServerMemory;

reconfigure;
go

3
Saya tahu ini adalah praktik terbaik yang cukup standar, tetapi bisakah Anda menjelaskan sedikit bagaimana mengubahnya akan membantu kesalahan yang mereka alami?
Erik Darling
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.