SQL Server menjadi lebih lambat dari waktu ke waktu sampai kita harus me-restart itu

8

Kami memiliki basis data dengan campuran beban kerja OLAP / OLTP. Pertanyaan cukup ad-hoc dan secara dinamis dibuat di server aplikasi tingkat menengah. Saat kami memulai server, kinerjanya cukup dapat diterima, tetapi konsumsi memori semakin lama semakin lama hingga semua memori yang tersedia (30GB) habis. Setelah itu, sistem menjadi semakin lambat.

Perintah seperti Dbcc freeproccachetidak berpengaruh.

Tidak ada banyak transaksi di select * from sys.dm_tran_session_transactions(tidak lebih dari ketika sistem baik-baik saja), beberapa kali daftar ini kosong.

Hasil pertama dbcc memorystatusadalah

VM Reserved               42136628
VM Committed               1487176
Locked Pages Allocated    24994048
Reserved Memory               1024
Reserved Memory In Use           0

Restart SQL Server memecahkan masalah untuk sementara waktu.

  1. Apa yang menyebabkan perilaku ini? Bagaimana itu bisa dihindari?
  2. Jika solusi nyata untuk penyebabnya terlalu sulit, apakah ada perintah yang memaksa SQL Server untuk benar-benar melepaskan semua memori tanpa restart DBMS lengkap?

Server berjalan pada perangkat keras khusus (bukan VM). Kami memiliki beberapa pekerjaan yang dijadwalkan, tetapi kami menonaktifkannya untuk sementara waktu, tanpa perubahan. Ada aplikasi mid tier lain yang berjalan di server yang sama, tetapi mereka menggunakan tidak lebih dari 2GB memori, CPU dapat diabaikan, dan hampir tidak ada I / O. Kami me-restart semua aplikasi seperti itu tanpa perubahan.

Alireza
sumber

Jawaban:

10

Saya sarankan mengumpulkan metrik kinerja pada server ini, sehingga Anda dapat menghilangkan dugaan dari pemecahan masalah jenis ini. Lihat artikel ini untuk panduan yang lebih lengkap jika Anda tidak tahu harus mulai dari mana dengan ini.

Secara khusus, saya akan memeriksa penghitung kinerja Memory\Available MBytesdan Paging File(_Total)\% Usagekarena Anda mengatakan masalah hanya mulai terjadi ketika buffer pool penuh. Angka-angka yang Anda dapatkan dari penghitung ini dapat menunjukkan bahwa pengaturan memori server maks perlu disesuaikan (baik naik atau turun) untuk jumlah memori fisik yang dialokasikan ke server. Seperti yang saya sebutkan di sini , saya tidak merekomendasikan mendasarkan pengaturan memori maks pada jumlah memori fisik kecuali sebagai tebakan untuk titik awal . Selalu ukur hasilnya, dan sesuaikan dari sana.

Jika jumlah memori bebas terlalu rendah (<500), atau penggunaan file halaman lebih dari nol , ini mungkin menunjukkan bahwa contoh SQL Server overcommitted: pada SQL Server 2008 R2, pengaturan memori server maks hanya mengontrol ukuran kumpulan buffer , dan bukan penggunaan memori lain seperti cache paket. SQL Server juga tidak peduli dengan aplikasi lain yang mungkin Anda jalankan di sistem. Penggunaan memori tambahan ini dapat memberikan tekanan memori pada Windows - atau aplikasi lain - yang mungkin mengarah ke pertukaran disk. Ini adalah sesuatu yang ingin Anda hindari sama sekali, terutama jika file halaman ada pada volume yang didukung oleh hanya cermin RAID 1 sederhana. Perasaan saya adalah bahwa ini adalah masalahnya, dan mundur dari pengaturan memori server maks harus memperbaiki masalah.

Jika jumlah memori bebas tinggi (> 1000) dan penggunaan file halaman nol, Anda mungkin dapat meningkatkan sedikit memori server maks (dalam penambahan 256 MB) untuk memaksimalkan penggunaan memori server. Namun, ini kemungkinan besar tidak akan menyelesaikan masalah, dan Anda harus mencari di tempat lain, mungkin di penghitung disk fisik dan harapan masa pakai kumpulan kumpulan. Jika kueri merobohkan kumpulan buffer, tidak ada yang dapat Anda lakukan selain meningkatkan kinerja disk, meningkatkan jumlah memori fisik yang tersedia untuk server sehingga semua halaman data dapat masuk ke memori sekaligus, atau memodifikasi database agar tidak mengambil sebanyak ruang fisik (mungkin dengan menggunakan kompresi baris atau halaman, atau dengan membangun kembali indeks dengan yang lebih tinggi FILLFACTOR).

Saya telah menerbitkan sebuah artikel tentang topik ini di sini yang membahas lebih mendalam tentang masalah ini dan bagaimana menyelesaikannya.

Jon Seigel
sumber
1

Secara umum, tren kelambatan dari waktu ke waktu harus dibalik, karena saat laman basis data berpindah ke cache, kinerja akan meningkat (usia harapan hidup dan rasio hit buffer meningkat seiring waktu), sudahkah Anda mengatur memori maks Anda ke (total_physical_mem - 2GB)?

Kedengarannya seperti beberapa pertanyaan Anda menyebabkan SQL Server keluar halaman dan banyak hal. Anda bisa mencoba Resource Governor untuk membatasi konsumsi memori dari kueri besar dan sedang, sehingga kueri aplikasi selalu memiliki buffer yang cukup.

Bebas keriput
sumber
2
Batasan memori dalam Resource Governor hanya mengontrol memori kueri, bukan memori kumpulan buffer.
Jon Seigel