SQL Server 2005: Ada kehabisan memori sistem untuk menjalankan kueri ini

13

Salah satu dari SQL Server kami, yang telah berjalan stabil selama beberapa waktu (tahun), baru-baru ini melempar kesalahan memori yang tidak mencukupi. Dari Log Acara Aplikasi, kita melihat:

ID Peristiwa: 701

Deskripsi: Memori sistem tidak cukup untuk menjalankan kueri ini.

Tim kami yang mengelola server ini terdiri dari sebagian besar pengembang yang menggandakan tugas sysadmin. Namun, keahlian utama kami adalah pengembangan. Yang sedang berkata, kita bingung bagaimana kita mengatasi masalah ini. Kami telah menjelajahi forum dan yang lainnya dan belum menemukan yang cocok

Jadi, berikut ini beberapa detail lainnya untuk membantu pemecahan masalah:

  • Memori server minimum kami diatur ke 0.
  • Memori server maksimum kami diatur ke 2000.
  • Total Memori Fisik adalah 3.325,85 MB (dari sysinfo).
  • Total Memori Virtual adalah 7.10 GB (dari sysinfo).
  • Kami tidak menggunakan AWE untuk mengalokasikan memori, tetapi kami sekarang untuk melihat apakah itu membuat perbedaan.
  • Kesalahan ini dilemparkan oleh pekerjaan yang membuat cadangan log transaksi, tidak menjalankan kueri.
  • Kami memiliki banyak server yang tertaut. Jenis RDBMS di sisi lain adalah SQL Server (2005 dan 2000), Oracle 10g, dan sistem OSI PI.
  • Berselang pada titik ini. Tampaknya kami tidak dapat menghubungkan waktu atau peristiwa dengan kesalahan.
  • Tentu saja, me-reboot tampaknya membuatnya pergi untuk sementara waktu, yang masuk akal karena sifat dari pesan kesalahan.
  • Server ini tiga kali lipat sebagai server aplikasi (beberapa Layanan Windows) dan server web, serta server basis data.

EDIT:

Kami berada di SP3. Sebagian besar posting yang kami temukan adalah pra SP1, yang tidak berlaku untuk kami.

SELECT  SERVERPROPERTY('productversion'), SERVERPROPERTY ('productlevel'), SERVERPROPERTY ('edition')

kembali

9.00.4035.00 Edisi Standar SP3

Aaron Daniels
sumber
Dapatkah Anda meninjau Log Kesalahan SQL Server karena mungkin ada detail tambahan tentang kesalahan ini.
John Sansom

Jawaban:

4

Saya akan menyarankan menggunakan parameter startup -g juga. Tampaknya bekerja untuk kebanyakan orang dan mungkin akan bekerja untuk Anda juga. Satu-satunya kekhawatiran saya adalah bahwa masalah mendasar mungkin tidak terselesaikan. Sebagai contoh jika ada kebocoran memori karena server yang ditautkan, dan MTL ditingkatkan menjadi 512Mb apakah itu hanya periode yang lebih lama antara masalah memori? Saya tidak tahu jawabannya, tetapi saya cenderung setuju dengan UndertheFold karena perfmon mungkin merupakan awal yang baik.

Mike Thien
sumber
7

Pesan kesalahan "Ada memori sistem tidak cukup untuk menjalankan permintaan ini." mengacu pada Virtual Address Space (VAS) yang tidak tersedia dan bukan memori dalam arti konvensional yaitu dalam ruang proses SQL Server.

Mengingat bahwa Anda hanya menjalankan dengan 3GB di server ini dan SQL Server telah ditetapkan hingga 2GB, ini berarti OS dan yang lebih penting apa pun di kotak memiliki kurang dari 1GB untuk dimainkan. Itu tidak banyak memori.

Jika masalah ini memang sebagai akibat dari kebocoran memori maka VAS di luar ruang proses SQL Server (memToLeave) yang sedang dikonsumsi.

Saya akan menyarankan menggunakan parameter startup -g untuk menetapkan lebih banyak memori ke bagian memToLeave.

Lihat artikel berikut untuk informasi lebih lanjut:

http://www.johnsansom.com/sql-server-memory-configuration-determining-memtoleave-settings/

Anda mungkin juga ingin mengurangi pengaturan memori maks SQL Server tapi saya akan melakukan ini sebagai pilihan terakhir.

John Sansom
sumber
Artikel bagus Terima kasih telah menulisnya juga! Kami memiliki beberapa AppDomains yang dibongkar di log SQL kami. Kami hanya memiliki 2 prosedur tersimpan CLR, dan mereka pada dasarnya hanya mendapatkan dan memasukkan data ke / dari layanan web. Tampaknya aneh bahwa 2 prosedur tersimpan CLR ini akan menggunakan terlalu banyak VAS di luar kotak.
Aaron Daniels
Sama-sama. Seperti yang Anda ketahui, alokasi default untuk memToLeave hanya 256MB. Ini adalah kotak pasir yang cukup kecil untuk AppDomain Anda, semua CLR / kode yang dikelola, permintaan Server Linked, SSIS dll. Terutama jika Anda menggunakan semua memori yang tersedia di server. Saya akan menyarankan menggandakannya menjadi 512MB menggunakan parameter startup -g.
John Sansom
1

Ini bisa terkait dengan kebocoran memori driver server yang terhubung, menurut utas forum ini :

Berikut ini adalah apa yang dikatakan Microsoft kepada kami.

Rupanya memproses data menggunakan server yang ditautkan secara spesifik driver fox pro menyebabkan kebocoran memori yang menumpuk dari waktu ke waktu.

percikan
sumber
0

Server ini tiga kali lipat sebagai server aplikasi (beberapa Layanan Windows) dan server web, serta server basis data.

Saya akan mengatur memori min Anda - sangat mungkin bahwa proses lain ini adalah "mencuri" memori dari SQL

Anda dapat menjalankan penghitung log menggunakan perfmon untuk mengonfirmasi ini dan / atau memberi diri Anda lebih banyak informasi untuk mengidentifikasi apa masalah sebenarnya.

CPU_BUSY
sumber
0

Referensi diambil dari blog ini!

Ada beberapa alternatif untuk menyelesaikan masalah ini.

Pertama, Periksa pengaturan SQL Server Anda untuk "memori server minimal" dan "memori server maks". Jika Anda menemukan perbedaan yang sangat kecil di kedua nilai, naikkan "memori server maks" Anda.

Kedua, Mengetahui kueri yang sudah berjalan lama dengan informasi penggunaan memorinya dan jika kueri ini dalam status siaga, harap verifikasi dan matikan proses ini. Optimalisasi kinerja basis data adalah hal utama untuk penggunaan memori.

Ketiga, Mengetahui penggunaan indeks untuk permintaan yang berjalan lama karena tanpa pengindeksan sistem yang tepat, DISK I / O Anda meningkat dan secara langsung memengaruhi memori Anda.

Keempat, Periksa ukuran file paging memori virtual dan tingkatkan ukuran file ini.

Kelima, Periksa ukuran "memori min per query" sebenarnya itu secara default 1024 KB tetapi dalam situasi yang jarang terjadi Anda dapat mengurangi ukuran parameter ini. Sebenarnya ini tidak disarankan, tetapi Anda bisa mencobanya.

Keenam, Cobalah untuk mengeksekusi perintah DBCC ini dan sekali lagi ini tidak dianjurkan karena dapat mempengaruhi keseluruhan kinerja server. Tetapi Anda dapat mencoba ini.

Landasan
sumber