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.
Jawaban:
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.
sumber
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<>@@spid
dan apa pendapat sumber daya yang Anda lihat (wait_type, wait_time, last_wait_type, wait_resource).sumber
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:
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.
sumber
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?
sumber
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?
sumber