Mengatasi masalah Kehabisan Memori

Berlaku untuk:yes SQL Server (semua versi yang didukung)

SQL Server In-Memory OLTP menggunakan lebih banyak memori dan dengan cara yang berbeda dari SQL Server. Ada kemungkinan bahwa jumlah memori yang Anda instal dan alokasikan untuk In-Memory OLTP menjadi tidak memadai untuk kebutuhan Anda yang berkembang. Jika demikian, Anda bisa kehabisan memori. Topik ini membahas cara memulihkan dari situasi OOM. Lihat Memantau dan Memecahkan Masalah Penggunaan Memori untuk panduan yang dapat membantu Anda menghindari banyak situasi OOM.

Tercakup dalam topik ini

Topik Gambaran Umum
Mengatasi kegagalan pemulihan database karena OOM Apa yang harus dilakukan jika Anda mendapatkan pesan kesalahan, "Operasi pemulihan gagal untuk database '<databaseName>' karena memori yang tidak cukup di kumpulan sumber daya '<resourcePoolName>'."
Mengatasi dampak kondisi memori rendah atau OOM pada beban kerja Apa yang harus dilakukan jika Anda menemukan masalah memori rendah berdampak negatif pada performa.
Mengatasi kegagalan alokasi halaman karena memori yang tidak mencukupi ketika memori yang cukup tersedia Apa yang harus dilakukan jika Anda mendapatkan pesan kesalahan, "Melarang alokasi halaman untuk database '<databaseName>' karena memori di kumpulan sumber daya '<resourcePoolName>'. ..." ketika memori yang tersedia cukup untuk operasi.
Praktik Terbaik menggunakan In-Memory OLTP di lingkungan VM Apa yang perlu diingat saat menggunakan In-Memory OLTP di lingkungan virtual.

Mengatasi kegagalan pemulihan database karena OOM

Ketika Anda mencoba memulihkan database, Anda mungkin mendapatkan pesan kesalahan: "Operasi pemulihan gagal untuk database '<databaseName>' karena memori yang tidak mencukuum di kumpulan sumber daya '<resourcePoolName>'." Ini menunjukkan bahwa server tidak memiliki cukup memori yang tersedia untuk memulihkan database.

Server yang Anda pulihkan database harus memiliki cukup memori yang tersedia untuk tabel yang dioptimalkan memori dalam cadangan database, jika tidak, database tidak akan online, dan akan ditandai sebagai tersangka.

Jika server memang memiliki memori fisik yang cukup, tetapi Anda masih melihat kesalahan ini, bisa jadi proses lain menggunakan terlalu banyak memori atau masalah konfigurasi menyebabkan tidak cukup memori tersedia untuk pemulihan. Untuk kelas masalah ini, gunakan langkah-langkah berikut untuk membuat lebih banyak memori tersedia untuk operasi pemulihan:

  • Tutup sementara aplikasi yang sedang berjalan.
    Dengan menutup satu atau beberapa aplikasi yang berjalan atau menghentikan layanan yang tidak diperlukan saat ini, Anda membuat memori yang mereka gunakan tersedia untuk operasi pemulihan. Anda dapat memulai ulang setelah pemulihan berhasil.

  • Tingkatkan nilai MAX_MEMORY_PERCENT.
    Jika database terikat ke kumpulan sumber daya, yang merupakan praktik terbaik, memori yang tersedia untuk dipulihkan diatur oleh MAX_MEMORY_PERCENT. Jika nilai terlalu rendah, pemulihan akan gagal. Cuplikan kode ini berubah MAX_MEMORY_PERCENT untuk kumpulan sumber daya PoolHk menjadi 70% memori yang diinstal.

    Penting

    Jika server berjalan pada VM dan tidak didedikasikan, atur nilai MIN_MEMORY_PERCENT ke nilai yang sama dengan MAX_MEMORY_PERCENT.
    Lihat topik Praktik Terbaik menggunakan In-Memory OLTP di lingkungan VM untuk informasi selengkapnya.

    -- disable resource governor  
    ALTER RESOURCE GOVERNOR DISABLE  
    
    -- change the value of MAX_MEMORY_PERCENT  
    ALTER RESOURCE POOL PoolHk  
    WITH  
         ( MAX_MEMORY_PERCENT = 70 )  
    GO  
    
    -- reconfigure the Resource Governor  
    --    RECONFIGURE enables resource governor  
    ALTER RESOURCE GOVERNOR RECONFIGURE  
    GO  
    
    

    Untuk informasi tentang nilai maksimum untuk MAX_MEMORY_PERCENT lihat bagian topik Persentase memori yang tersedia untuk tabel dan indeks yang dioptimalkan memori.

  • Tingkatkan memori server maks.
    Untuk informasi tentang mengonfigurasi memori server maks , lihat topik Opsi Konfigurasi Server Memori Server.

Mengatasi dampak kondisi memori rendah atau OOM pada beban kerja

Jelas, yang terbaik adalah tidak masuk ke memori rendah atau situasi OOM (Kehabisan Memori). Perencanaan dan pemantauan yang baik dapat membantu menghindari situasi OOM. Namun, perencanaan terbaik tidak selalu memperkirakan apa yang sebenarnya terjadi dan Anda mungkin berakhir dengan memori atau OOM yang rendah. Ada dua langkah untuk memulihkan dari OOM:

  1. Buka DAC (Koneksi Administrator Khusus)

  2. Mengambil tindakan korektif

Buka DAC (Koneksi Administrator Khusus)

SQL Server menyediakan koneksi administrator khusus (DAC). DAC memungkinkan administrator untuk mengakses instans SQL Server Database Engine yang sedang berjalan untuk memecahkan masalah di server-bahkan ketika server tidak responsif terhadap koneksi klien lain. DAC tersedia melalui sqlcmd utilitas dan SQL Server Management Studio.

Untuk panduan tentang menggunakan DAC melalui SQL Server Management Directory atau sqlcmd, lihat Koneksi Diagnostik untuk Administrator Database.

Mengambil tindakan korektif

Untuk mengatasi kondisi OOM, Anda perlu membebaskan memori yang ada dengan mengurangi penggunaan, atau membuat lebih banyak memori tersedia untuk tabel dalam memori Anda.

Mengosongkan memori yang ada

Hapus baris tabel yang dioptimalkan memori yang tidak penting dan tunggu pengumpulan sampah

Anda dapat menghapus baris yang tidak penting dari tabel memori yang dioptimalkan. Pengumpul sampah mengembalikan memori yang digunakan oleh baris ini ke memori yang tersedia. Mesin OLTP dalam memori mengumpulkan baris sampah secara agresif. Namun, transaksi yang berjalan lama dapat mencegah pengumpulan sampah. Misalnya, jika Anda memiliki transaksi yang berjalan selama 5 menit, setiap versi baris yang dibuat karena operasi pembaruan/penghapusan saat transaksi aktif tidak dapat dikumpulkan sampah.

Memindahkan satu atau beberapa baris ke tabel berbasis disk

Artikel TechNet berikut memberikan panduan tentang memindahkan baris dari tabel yang dioptimalkan memori ke tabel berbasis disk.

Menambah memori yang tersedia

Meningkatkan nilai MAX_MEMORY_PERCENT pada kumpulan sumber daya

Jika Anda belum membuat kumpulan sumber daya bernama untuk tabel dalam memori, Anda harus melakukannya dan mengikat database OLTP In-Memory Anda ke dalamnya. Lihat topik Mengikat Database dengan Tabel Memory-Optimized ke Kumpulan Sumber Daya untuk panduan tentang membuat dan mengikat database OLTP In-Memory Anda ke kumpulan sumber daya.

Jika database OLTP In-Memory Anda terikat ke kumpulan sumber daya, Anda mungkin dapat meningkatkan persentase memori yang dapat diakses kumpulan. Lihat MIN_MEMORY_PERCENT Perubahan sub-topik dan MAX_MEMORY_PERCENT pada kumpulan yang ada untuk panduan tentang mengubah nilai MIN_MEMORY_PERCENT dan MAX_MEMORY_PERCENT untuk kumpulan sumber daya.

Tingkatkan nilai MAX_MEMORY_PERCENT.
Cuplikan kode ini berubah MAX_MEMORY_PERCENT untuk kumpulan sumber daya PoolHk menjadi 70% memori yang diinstal.

Penting

Jika server berjalan pada VM dan tidak didedikasikan, atur nilai MIN_MEMORY_PERCENT dan MAX_MEMORY_PERCENT ke nilai yang sama.
Lihat topik Praktik Terbaik menggunakan In-Memory OLTP di lingkungan VM untuk informasi selengkapnya.

-- disable resource governor  
ALTER RESOURCE GOVERNOR DISABLE  
  
-- change the value of MAX_MEMORY_PERCENT  
ALTER RESOURCE POOL PoolHk  
WITH  
     ( MAX_MEMORY_PERCENT = 70 )  
GO  
  
-- reconfigure the Resource Governor to enabled it
ALTER RESOURCE GOVERNOR RECONFIGURE  
GO  

Untuk informasi tentang nilai maksimum untuk MAX_MEMORY_PERCENT lihat bagian topik Persentase memori yang tersedia untuk tabel dan indeks yang dioptimalkan memori.

Instal memori tambahan

Pada akhirnya solusi terbaik, jika memungkinkan, adalah menginstal memori fisik tambahan. Jika Anda melakukan ini, ingatlah bahwa Anda mungkin juga akan dapat meningkatkan nilai MAX_MEMORY_PERCENT (lihat sub-topik Ubah MIN_MEMORY_PERCENT dan MAX_MEMORY_PERCENT pada kumpulan yang ada) karena SQL Server kemungkinan tidak akan membutuhkan lebih banyak memori, memungkinkan Anda untuk membuat sebagian besar jika tidak semua memori yang baru diinstal tersedia untuk kumpulan sumber daya.

Penting

Jika server berjalan pada VM dan tidak didedikasikan, atur nilai MIN_MEMORY_PERCENT dan MAX_MEMORY_PERCENT ke nilai yang sama.
Lihat topik Praktik Terbaik menggunakan In-Memory OLTP di lingkungan VM untuk informasi selengkapnya.

Mengatasi kegagalan alokasi halaman karena memori yang tidak mencukupi ketika memori yang cukup tersedia

Jika Anda mendapatkan pesan kesalahan, Disallowing page allocations for database '*\<databaseName>*' due to insufficient memory in the resource pool '*\<resourcePoolName>*'. See 'https://go.microsoft.com/fwlink/?LinkId=330673' for more information. dalam log kesalahan ketika memori fisik yang tersedia cukup untuk mengalokasikan halaman, itu mungkin karena Resource Governor yang dinonaktifkan. Ketika Resource Governor dinonaktifkan MEMORYBROKER_FOR_RESERVE menginduksi tekanan memori buatan.

Untuk mengatasinya, Anda perlu mengaktifkan Resource Governor.

Lihat Mengaktifkan Resource Governor untuk informasi tentang Batasan dan Pembatasan serta panduan tentang mengaktifkan Resource Governor menggunakan Object Explorer, properti Resource Governor, atau SQL Transact.

Praktik Terbaik menggunakan In-Memory OLTP di lingkungan VM

Virtualisasi server dapat membantu Anda menurunkan modal TI dan biaya operasional dan mencapai efisiensi TI yang lebih besar dengan penyediaan aplikasi yang ditingkatkan, pemeliharaan, ketersediaan, dan proses pencadangan/pemulihan. Dengan kemajuan teknologi baru-baru ini, beban kerja database yang kompleks dapat lebih mudah dikonsolidasikan menggunakan virtualisasi. Topik ini mencakup praktik terbaik untuk menggunakan SQL Server In-Memory OLTP di lingkungan virtual.

Pra-alokasi memori

Untuk memori dalam lingkungan virtual, performa yang lebih baik dan dukungan yang ditingkatkan adalah pertimbangan penting. Anda harus dapat dengan cepat mengalokasikan memori ke komputer virtual tergantung pada persyaratannya (beban puncak dan di luar puncak) dan memastikan bahwa memori tidak terbuang sia-sia. Fitur Memori Dinamis Hyper-V meningkatkan kelincahan dalam bagaimana memori dialokasikan dan dikelola antara komputer virtual yang berjalan pada host.

Beberapa praktik terbaik untuk memvirtualisasikan dan mengelola SQL Server perlu dimodifikasi saat memvirtualisasi database dengan tabel yang dioptimalkan memori. Tanpa tabel yang dioptimalkan memori, dua praktik terbaik adalah:

  • Jika Anda menggunakan memori server min, lebih baik menetapkan hanya jumlah memori yang diperlukan sehingga memori yang cukup tetap untuk proses lain (sehingga menghindari penomor).
  • Jangan mengatur nilai pra-alokasi memori terlalu tinggi. Jika tidak, proses lain mungkin tidak mendapatkan memori yang cukup pada saat mereka membutuhkannya, dan ini dapat mengakibatkan halaman memori.

Jika Anda mengikuti praktik di atas untuk database dengan tabel yang dioptimalkan memori, upaya untuk memulihkan dan memulihkan database dapat mengakibatkan database berada dalam status "Pemulihan Tertunda", bahkan jika Anda memiliki memori yang cukup untuk memulihkan database. Alasan untuk ini adalah bahwa, ketika memulai, In-Memory OLTP membawa data ke dalam memori lebih agresif daripada alokasi memori dinamis mengalokasikan memori ke database.

Resolusi

Untuk mengurangi hal ini, pra-alokasikan memori yang cukup ke database untuk memulihkan atau memulai ulang database, bukan nilai minimum yang mengandalkan memori dinamis untuk menyediakan memori tambahan saat diperlukan.

Lihat juga

Mengelola Memori untuk OLTP In-Memory
Memantau dan Memecahkan Masalah Penggunaan Memori
Mengikat Database dengan Tabel Memory-Optimized ke Kumpulan Sumber Daya
Panduan Arsitektur Manajemen Memori
Opsi Konfigurasi Server Memori Server