Mengapa restart secara berkala diperlukan untuk menjaga instance saya berfungsi dengan baik?

22

Kami memiliki server DB produksi pada SQL 2005. Semuanya berjalan normal untuk sementara waktu, tetapi setelah beberapa minggu kami melihat penurunan kinerja yang penting. Hanya dengan me-restart SQL Server, kinerja kembali normal.

Beberapa latar belakang:

  • Menjalankan lebih dari 1.200 basis data (kebanyakan penyewa tunggal, beberapa penyewa multi). Sebelum ada yang memberi kuliah tentang pindah ke hanya multi-penyewa, ada alasan yang sah untuk menjaga struktur ini ......
  • RAM adalah 16 GB. Setelah memulai ulang, SQL Server tidak perlu terlalu lama untuk kembali ke penggunaan 15 GB.
  • Koneksi DB aktif adalah sekitar 80 koneksi - yang kami rasa cukup sehat mengingat ada satu kolam koneksi per server web per proses - jadi kami tidak memiliki masalah kebocoran koneksi.

Kami telah mencoba beberapa hal di waktu non-puncak: - Jalankan DBCC DROPCLEANBUFFERS (dengan CHECKPOINT) untuk menghapus cache data. Ini tidak berpengaruh, juga tidak menghapus penggunaan RAM). - Jalankan FREEPROCCACHE dan FREESYSTEMCACHE untuk menghapus rencana kueri dan menyimpan cache proc. Tidak berpengaruh.

Jelas memulai ulang SQL Server tidak ideal dalam lingkungan produksi aktif. Kami melewatkan sesuatu. Adakah yang lain melalui ini?

UPDATE: April-28-2012 Masih berjuang melawan masalah ini. Saya telah menurunkan memori untuk SQL Server menjadi 10 GB, hanya untuk mengesampingkan pertikaian dengan OS. Saya semakin dekat dengan mempersempitnya, tetapi butuh bantuan dari langkah selanjutnya.

Inilah yang saya temukan, setelah me-restart SQL Server, file halaman berkisar antara 12,3 GB dan 12,5 GB. Itu akan tetap seperti itu selama berhari-hari. Total utas server akan nongkrong di antara 850 dan 930 - juga stabil dan konsisten selama berhari-hari (sqlserver stabil antara 55 dan 85 yang tergantung pada lalu lintas).

Lalu, ada "sebuah acara". Saya tidak tahu apa acara itu, saya tidak bisa melihatnya di log, dan saya tidak bisa melihat sesuatu yang konsisten pada hari minggu atau waktu itu terjadi, tetapi semua suddent dia pagefile melompat ke 14.1 atau 14.2 GB, dan utas melompat ke antara 1750 dan 1785.

Memeriksa perfom ketika ini terjadi, lebih dari 900 di antaranya adalah sqlserver. Jadi saya pergi ke sp_who2 untuk melihat dari mana asal utas-utas ini ... dan hanya ada 80 koneksi db yang digunakan.

Jadi .... apakah ada yang punya ide bagaimana saya dapat menemukan di mana sisa 900 thread ini di SQL server, dan apa yang mereka lakukan?

UPDATE: Juni-01-2012 Masih berjuang melawan masalah ini. Bagi siapa pun yang membaca ini masih, masalah dengan utas melompat telah diatasi. Ini disebabkan oleh perangkat lunak cadangan ComVault yang diautodisasi. Itu membuat utas yang mencoba untuk membuat cadangan basis data yang sudah tidak ada lagi (itu mempertahankan daftar basis data sebelumnya) daripada hanya membuat cadangan basis data saat ini.

Tetapi - masalahnya masih ada, dan kita harus memulai kembali setiap minggu, memberi atau mengambil beberapa hari. Bekerja dengan tim Rackspace untuk melihat apakah mereka dapat menjelaskan.

PaulJ
sumber
1
Poin untuk pertanyaan menyeluruh, tetapi apakah Anda menganggap bahwa 16 GB RAM mungkin tidak cukup untuk 1.200 basis data?
Nick Vaccaro
Tidak dapat benar-benar membantu dalam skema besar tapi saya tahu bahwa MSSQL telah dirancang untuk mengkonsumsi RAM sebanyak yang tersedia. Ini masuk akal karena jika tidak ada RAM akan sia-sia. Fakta bahwa itu melompat ke 15GB tak lama setelah restart tidak benar-benar masalah itu sendiri, saya tidak berpikir. Namun @Norla mungkin benar bahwa 16 saja tidak cukup untuk apa yang ingin Anda lakukan.
Berapa banyak SPID yang aktif selama kelambatan? Jalankan sp_who2 dan berikan jumlah barisnya.
Nick Vaccaro
Hanya memeriksa - Apakah Anda memiliki pekerjaan server Sql berjalan? Bisakah Anda menghentikan mereka satu per satu untuk melihat apakah ada di antara mereka yang menyebabkan masalah ini?
Apa outputnya: pilih SUM (single_pages_kb + multi_pages_kb) /1024.0 dari sys.dm_os_memory_clerks di mana [name] = 'TokenAndPermUserStore'
Mark Storey-Smith

Jawaban:

7

Anda mengatakan bahwa semuanya baik-baik saja, lalu setelah beberapa minggu, kinerja menurun. (Biasanya, orang mengklaim bahwa kinerja turun dengan cepat, atau pada waktu tertentu, atau pada interval yang tampaknya acak. Itu bisa berarti kinerja I / O yang buruk atau badai kunci atau permintaan intensif cpu berjalan pada waktu yang sulit, atau pekerjaan terjadwal kelas berat atau kurangnya pengindeksan atau statistik yang buruk menyebabkan permintaan intensif disk atau membaca. Atau hal-hal lain.) Minggu tidak biasa.

Hipotesis saya adalah aplikasi lain di server Anda bocor memori. Saya telah melihat ini dengan perangkat lunak virus (penjahat perangkat lunak server favorit setiap DBA) dan perangkat lunak pemantauan pihak ke-3. Saya akan memeriksa penggunaan memori SQL Server dari waktu ke waktu, dan saya akan mengambil semua penggunaan memori dari semua aplikasi lain di kotak juga. Jika Anda memiliki batas keras yang ditetapkan pada penggunaan memori SQL Server dan mengaturnya untuk tidak mengizinkan paging, itu mungkin aplikasi lain yang mendapatkan paging keluar dan memakan kapasitas I / O.

Itu tidak sulit untuk dicari. Jika Anda belum menyimpan metrik di server, saya akan menjalankan Perfmon dan mengambil sampel setiap 30 atau 60 menit. Setelah beberapa hari, Anda dapat melihat penggunaan memori aplikasi lain merayap ke atas.

Apakah ada pesan kesalahan dalam log SQL Server yang menyatakan bahwa "sebagian besar server sql telah dihapus"? Itu juga akan menjadi petunjuk besar.

selat darin
sumber
Saya setuju, perilaku itu membuatnya terdengar seperti kebocoran memori.
Nick Kavadias
+1 Untuk kebocoran memori. Saya ragu harapan hidup halaman sangat panjang pada server ini, tetapi seharusnya tidak membuat pagefile tumbuh dengan cepat. FYI, masalah yang hampir sama di sini (AV-lah yang menjadi masalah): social.msdn.microsoft.com/Forums/en/sqlsetupandupgrade/thread/…
brian
5

Biarkan saya mengucapkan selamat kepada Anda karena dapat menjalankan 1.200 DB pada satu contoh SQL server dengan hanya 16 GB RAM dan hanya memiliki jenis masalah ini setelah beberapa minggu berjalan dengan lancar. Cerita yang bagus untuk diceritakan di bab PASS lokal.

Sekarang untuk memecahkan masalah: RAM Anda adalah 16 GB untuk SQL dan OS. Saya mengasumsikan pengaturan memori maks Anda adalah 15 GB atau maks. Ini bisa menyebabkan buffer pool menghabiskan semua memori dan mencekik OS. Anda mengatakan bahwa membersihkan kumpulan buffer dan cache tidak menunjukkan perbedaan, ditambah PLE Anda di atas 300. Ini memberi kesaksian tentang leher botol memori. Bagaimana CPU dan IO di server (spesifikasi / statistik)?

Jalankan select * from sys.dm_exec_request where session_id>50 and session_id<>@@spiddan apa pendapat sumber daya yang Anda lihat (wait_type, wait_time, last_wait_type, wait_resource).

StanleyJohns
sumber
1200 tidak terlalu buruk! Kendala terbesar adalah mengatasi masalah pool koneksi, yang diselesaikan dengan membuat string koneksi diatur ke master, dan kemudian USE [DBName] setelah koneksi. Dalam hal permintaan, saya berlari pilih * dari sys.dm_exec_requests di mana session_id> 50 dan session_id <> @@ spid, dan ini adalah daftar pendek dari 4 hingga 5 permintaan, maks, dan mereka meninggalkan daftar dalam 500 ms biasanya. Tetapi saya akan mencoba ini setelah kita memperlambatnya, mulai lagi pada hari Minggu, jadi sekarang bersenandung seperti biasa.
PaulJ
@ PaulJ terima kasih atas tip tentang koneksi pooling. Saya sedang membacanya sekarang.
StanleyJohns
5

1200 basis data, sebuah os, dan mungkin hal-hal lain? Ya, saya pikir server itu sendiri akan membutuhkan lebih dari 1gb ram berfungsi, terutama mengingat bahwa, jika Anda menetapkan 15gb sebagai pengaturan memori maks SQL Server, masih membutuhkan memori tambahan di luar 15gb untuk utas.

Saya akan menundukkan SQL Server ke 14GB untuk memberikan server sedikit lebih banyak ruang bernapas.

Juga, contoh yang diberikan dalam "Profesional SQL Server 2008 Internal dan Pemecahan Masalah" untuk tunjangan memori pada sistem SQL Server 2008 x64 dengan utilitas cadangan bagian ketiga dengan RAM 16GB:

  • 2 GB untuk Windows
  • 1GB untuk utas pekerja
  • 1GB untuk KKL, dll.
  • 1GB untuk program cadangan
  • 11GB untuk SQL Server

Dalam buku ini ditunjukkan cara menentukan jumlah maksimal utas yang dapat Anda miliki, dan cara menghitung berapa banyak memori yang akan diambil. Jalankan ini (ubah jenis server agar sesuai dengan server Anda) untuk mencari tahu berapa banyak memori yang diperlukan thread Anda.

declare @servertype int

set @servertype=1
/*
1: x86 (32-bit)
2: x64 (64-bit)
3: IA64

*/

select max_workers_count *
    (
        case @servertype when 1 then .5
            when 2 then 2
            when 3 then 4
            else .5
        end
    )
from sys.dm_os_sys_info
DForck42
sumber
hal-hal hebat, terima kasih. Saya sudah memindahkannya ke 14 GB. Belajar sesuatu yang baru di sini, karena saya selalu membiarkan SQL Server mengambil apa yang diinginkannya. Artikel bagus lainnya untuk referensi yang mendukung ini: sqlservercentral.com/blogs/glennberry/2009/10/29/…
PaulJ
4

Jika memori basis data terdistribusi secara merata di semua basis data, Anda hanya memiliki 12,8 Meg untuk setiap basis data (15 * 1024) /1200=12.8. Anda membutuhkan lebih banyak memori.

Anda perlu melihat mengapa kinerja melambat. Apakah Anda melihat penguncian, pemblokiran, dll? Seperti apa statistik tunggu?

mrdenny
sumber
3

Perintah DBCC hanya akan menghapus buffer memori, mereka tidak akan melepaskan memori kembali ke OS.

Apakah Anda tahu bahwa sebenarnya SQL Server mengkonsumsi memori? Saya akan menyarankan melihat menyiapkan sesi Perfmon atau mulai mengumpulkan informasi DMV setelah restart untuk mengetahui apa yang sedang dilakukan dan dikerjakan oleh SQL Server. Perhatikan juga jika pengguna melakukan lebih banyak pekerjaan daripada biasanya selama waktu pengumpulan Anda (seperti pemrosesan Akhir Bulan, dll). Apakah Anda menjalankan SSRS, SSIS, atau SSAS di server yang sama?

Anda memiliki 1.200 database pada sistem, apa ukuran DB terbesar yang Anda miliki?

Shawn Melton
sumber
db terbesar adalah 5GB. Hanya ~ 25 dari mereka 1GB atau lebih. Mayoritas luas adalah 50 hingga 200 MB.
PaulJ
"Apakah Anda menjalankan SSR, SSIS, atau SSAS di server yang sama?" - Tidak menjalankan layanan itu. Ini kotak sql murni.
PaulJ