Bagaimana cara mendapatkan SQL Server untuk melepaskan memorinya?

19

Saya tahu SQL suka RAM, tetapi melepaskannya ketika Windows bertanya. Saya tahu ini adalah bagaimana seharusnya SQL bekerja. Tetapi saya memiliki Administrator Windows yang tidak yakin bahwa SQL akan benar-benar mengembalikan RAM, dan pada server (virtual) khusus ini, SQL tidak perlu banyak setelah Layanan Analisis selesai, tetapi tidak ada hal lain di server ini yang mengganggu untuk tanyakan banyak tentang SQL.

Jadi saya mencoba meyakinkan Admin Windows bahwa masalah dengan lingkungan virtual bukan "karena SQL menggunakan terlalu banyak RAM", tapi saya sepertinya tidak bisa membujuk SQL untuk melepaskannya tanpa memulai ulang layanan.

Saat memproses kubus, layanan SQL dengan senang hati mengambil 8GB RAM, tetapi karena tidak ada tekanan di dalamnya, itu tidak melepaskan banyak dari ini selama hari normal. Orang-orang Windows berteriak, dan akan jauh lebih baik untuk memiliki rilis SQL ini.

Saya tidak ingin menggunakan pengaturan memori maks, karena saya benar-benar ingin SQL menggunakan RAM sebanyak itu saat memproses. Saya hanya ingin turun lagi setelahnya.

Ini berpotensi duplikat dari kedua SQL Server tidak melepaskan Memori dan Mengembalikan memori dari SQL Server , tapi saya bertanya-tanya apakah ada jawaban yang berbeda. Menunggu Windows untuk mengklaimnya kembali tidak akan membujuk orang Windows di sini. Memulai kembali layanan adalah suatu pilihan, tetapi saya benar-benar bukan penggemar ide itu.

Saya ingin tahu cara mendapatkan Windows untuk meminta kembali ...

Rob Farley
sumber
2
Apa ... sysadmin mengeluh tentang RAM yang digunakan? Saya merasa kesal ketika RAM TIDAK digunakan, karena jika tidak digunakan hanya akan sia-sia ...
Mark Henderson
Saya juga tidak mengerti, jika mesin tidak membutuhkan memori - di mana masalahnya? Ini adalah cara kerja sistem operasi dan aplikasinya ... mengingat beban kerja memiliki layanan SQL yang tidak digunakan menyimpan sebagian besar memori ketika tidak ada yang lain yang diperlukan, itu dapat meningkatkan waktu respons dan / atau kinerja untuk pekerjaan SQL berikutnya?
Oskar Duveborn
Admin Windows merasa bahwa SQL sedang menekan mesin karena prosesnya memiliki begitu banyak RAM. Saya tahu kotak itu tidak dalam tekanan dari SQL, dan dapat mendemonstrasikannya dengan me-restart layanan SQL, menunjukkan bahwa itu hanya memakan banyak RAM ketika mendapatkan data untuk pemrosesan SSAS. Jadi saya ingin SQL untuk melepaskan memori untuk menunjukkan jumlah RAM yang SQL gunakan sepanjang hari. Ini bukan tentang membuat mereka memberikan lebih banyak RAM, hanya membuat mereka berhenti menyalahkan SQL untuk hal-hal.
Rob Farley
2
Setuju dengan Farseeker, sysadmin seharusnya senang bahwa RAM sedang digunakan. Jika tidak direklamasi, maka server tidak membutuhkannya. Mungkin meminta sysadmin untuk melihat kesalahan halaman untuk menunjukkan sistem tidak tertekan?
Nick Kavadias
2
Jika sysadmin Anda tidak mengerti apa yang diwakili Page Faults dan mengapa memori habis tetapi tidak ada Page Fault yang sebenarnya terjadi bukan masalah, saya tidak tahu bagaimana cara membantu Anda. Kamu tidak bisa memperbaiki kebodohan. Namun, satu hal yang dapat Anda lakukan adalah menggunakan sp_configure untuk mengonfigurasikan memori maks ke bawah saat Anda tidak menggunakan sistem, dan mengkonfigurasinya kembali ketika Anda membutuhkannya. Namun, ini tampaknya konyol. sp_configureumumnya adalah sesuatu yang harus Anda tentukan sekali dan biarkan sendiri.
Bacon Bits

Jawaban:

12

Saya percaya satu-satunya pilihan Anda adalah memulai kembali Layanan SQL, atau menjalankan aplikasi yang menghabiskan banyak memori untuk memaksa SQL melepaskannya.

Saya suka saran @Nick Kavadias: monitor Memory: Page Faults / Sec performance counter untuk menunjukkan bahwa SQL belum menempatkan memori OS di bawah tekanan.

Mitch Wheat
sumber
2
Terima kasih Mitch ... Biarkan saya menemukan file teks 10GB untuk Notepad.
Rob Farley
lol !, sebenarnya itu bukan ide yang buruk!
Mitch Wheat
mungkin menggunakan file 2GB ...
Mitch Wheat
5

Salah satu cara untuk menunjukkan kepada mereka bahwa itu akan melakukan itu adalah untuk memiliki SQL Server mengunyah semua memori. Kemudian salin file besar melalui jaringan (file besar SQL Backup sangat cocok untuk ini). Ini akan menyebabkan cache sistem terisi, dan Windows akan mulai meminta SQL untuk memorinya kembali. SQL akan mulai mengembalikan memori kembali ke OS hingga mencapai pengaturan memori min Anda.

(Maaf tidak mendapatkan seluruh pertanyaan melalui Twitter, tampaknya diperlukan lebih dari 140 karakter.)

mrdenny
sumber
1
Saya berharap untuk beberapa proses yang dapat saya gunakan yang akan meminta SQL untuk memori kembali (setelah buffer telah dibersihkan dan dijatuhkan), tetapi tanpa harus melumpuhkan kotak untuk melakukannya.
Rob Farley
Saya tidak berpikir bahwa ada cara untuk memaksa manajer memori Windows untuk meminta memori kembali, tanpa memaksa masalah melalui cara lain. Anda mungkin dapat menulis sesuatu yang mengenai win32 API secara langsung untuk melakukannya, tetapi sejauh yang saya tahu satu-satunya cara untuk memicu Windows untuk meminta memori kembali adalah dengan membuatnya membutuhkan lebih banyak memori untuk proses lain. Periksa dengan Bob atau Paul, mereka mungkin memiliki lebih banyak info.
mrdenny
3
Driver balon VMware melakukan hal ini - ia meminta Windows semakin banyak memori untuk mendapatkan SQL Server (atau aplikasi lain) untuk menyerahkan memori mereka.
Brent Ozar
Ya - saya berharap saya tidak perlu melakukan hal seperti itu.
Rob Farley
@BrentOzar, driver ballon VMware hanya mengambil kembali memori dari cache sistem , bukan memori proses aktual; itu dirancang sebagai cara untuk memberi tahu OS "jangan menggunakan semua memori yang tersedia untuk hal-hal sepele", bukan untuk menjatuhkannya.
Massimo
2

Anda menyebutkan 'kubus' sehingga tidak jelas apakah Anda berbicara tentang mesin AS atau mesin relasional. Mesin relasional dapat membebaskan memori sesuai permintaan:

DBCC FREESYSTEMCACHE('<cache name>');

Di mana 'nama cache' diambil dari sys.dm_os_memory_clerks . Spesifikasi DBRE FREESYSTEMCACHE hanya menyebutkan kumpulan gubernur, tetapi sebenarnya lebih banyak cache yang bisa diusir.

Tetapi jika semua memori digunakan oleh buffer pool, maka mengusir seluruh buffer pool akan menghasilkan degradasi kinerja yang luar biasa dan beban IO yang besar. Lebih baik biarkan SQL menangani ini sendiri.

Remus Rusanu
sumber
1
Hai Remus, cache buffer relasional besar setelah pemrosesan kubus. Setelah itu, saya benar-benar ingin cache dibersihkan, dijatuhkan dan memori kembali ke Windows. DBCC DROPCLEANBUFFERS dan FREESYSTEMCACHE mengosongkan cache tetapi tidak mengembalikan memori ke Windows, jadi itu tidak sepenuhnya apa yang saya inginkan.
Rob Farley
2
Secara teori Anda bisa memalsukan tekanan memori (mis. Anda bisa trampolin QueryMemoryResourceNotification msdn.microsoft.com/en-us/library/aa366799%28VS.85%29.aspx ) tetapi saya benar-benar tidak akan pergi ke sana. Jika SQL tidak mengeluarkan memori yang dikomit adalah karena OS tidak membutuhkannya. OS tidak memerlukan memori karena SQL adalah satu-satunya aplikasi pada host ( stackoverflow.com/questions/1401834/… ), bukan? Jika Anda menjalankan beberapa aplikasi lain di sepanjang SQL, Anda sudah mendapatkannya.
Remus Rusanu
2

Dengan mesin AS dan DS Anda dapat membatasi memori sehingga tetap berada di bawah ambang batas aman; ini direkomendasikan pada mesin 64 bith dengan banyak RAM dan / atau beberapa contoh SQL. Setidaknya untuk mesin database jika Anda mengubah tutup memori di bawah apa penggunaan saat ini akan mengurangi jumlah memori dengan cepat tanpa harus me-restart layanan, tidak yakin tentang SSAS sekalipun.

Jason Cumberland
sumber
Memiliki penutup tidak apa-apa, tapi saya pikir saya akan ingin menarik memori maks ke bawah setelah pemrosesan dan kemudian mendorongnya kembali, ketika saya lebih suka membersihkan buffer, menjatuhkannya, dan meminta Windows untuk beberapa tekanan memori.
Rob Farley
1

Cara termudah yang saya temukan adalah pergi ke properti memori server, masukkan nilai yang lebih kecil, terapkan, tunggu beberapa menit dan sesuaikan konfigurasi cadangan.

Kami juga telah menemukan penggunaan server throttling sql memori benar-benar dapat meningkatkan kinerja server karena memberikan windows ram lebih banyak untuk caching, dll

Nick van Esch
sumber