Örneğimin iyi performans göstermesini sağlamak için neden periyodik olarak yeniden başlatılmaları gerekiyor?


22

SQL 2005'te bir üretim DB sunucumuz var. Her şey bir süre normal çalışıyor, ancak birkaç hafta sonra kayda değer bir performans düşüşü görüyoruz. Yalnızca SQL Server'ı yeniden başlatmak performansı normale döndürür.

Bazı arka plan:

  • 1200'den fazla veritabanı çalıştırılıyor (çoğunlukla tek kiracı, bazıları çok kiracı). Biri sadece çok kiracıya geçme dersi vermeden önce, bu yapıyı korumak için geçerli sebepler var.
  • RAM 16 GB'dir. Yeniden başlattıktan sonra, SQL Server'ın 15 GB kullanımına geri dönmesi çok uzun sürmüyor.
  • Aktif DB bağlantıları yaklaşık 80 bağlantıdır - işlem başına web sunucusu başına bir bağlantı havuzu olduğu düşünülürse oldukça sağlıklıdır - bu nedenle bağlantı sızıntısı sorunumuz yoktur.

Yoğun olmayan zamanlarda birkaç şey denedik: - Veri önbelleğini temizlemek için DBCC DROPCLEANBUFFERS (CHECKPOINT ile) çalıştırın. Etkisi yoktur ve RAM kullanımının hiçbirini temizlemez). - Sorgu planlarını ve depolanan proc önbelleğini temizlemek için FREEPROCCACHE ve FREESYSTEMCACHE uygulamasını çalıştırın. Etkisi yok.

Açıkçası, SQL Server'ı yeniden başlatmak aktif bir üretim ortamında ideal değildir. Bir şeyleri özlüyoruz. Bundan başka biri geçiyor mu?

GÜNCELLEME: Nisan-28-2012 Hala bu problemle mücadele. Ben sadece işletim sistemi ile herhangi bir çekişme ekarte etmek için, SQL Server için belleği 10 GB'a düşürdüm. Daraltmaya daha da yaklaşıyorum, ancak bir sonraki adımda yardıma ihtiyacım var.

İşte bulduklarım, SQL Server'ı yeniden başlattıktan sonra sayfa dosyası 12.3 GB ile 12.5 GB arasında değişiyor. Günlerce böyle kalacak. Toplam sunucu iş parçacığı 850 ile 930 arasında takılacak - ayrıca günler boyunca sabit ve tutarlı (sqlserver sürekli olarak 55 ve 85 arasında trafiğe bağlı olanlar arasında).

Sonra, "bir olay" var. Etkinliğin ne olduğu hakkında hiçbir fikrim yok, günlüklerde göremiyorum ve haftanın günü veya saatinin gerçekleştiği tarihte tutarlı bir şey göremiyorum, ancak o ani sayfa dosyasının tamamı 14.1 veya 14.2'ye atlıyor GB ve dişliler 1750 ve 1785 arasında atlar.

Bu gerçekleştiğinde perfom kontrolü, bu ipliklerin 900'den fazlası sqlserver'dır. Bu yüzden bu konuların nereden geldiğini görmek için sp_who2'ye gidiyorum ... ve kullanılmış 80 ya da öylesine db bağlantıları var.

Peki .... kimse bu 900 ipliğin SQL sunucusundaki yerini ve ne yaptıklarını nasıl bulabileceğime dair bir fikri var mı?

GÜNCELLEME: Haziran-01-2012 Hala konuyla mücadele. Bunu hala okuyanlar için, yukarı zıplayan konu ile ilgili sorun çözüldü. Bunun nedeni otomatik olarak güncellenen ComVault yedekleme yazılımıdır. Sadece mevcut veritabanlarını yedeklemek yerine, artık orada olmayan (önceki veritabanlarının bir listesini tutuyordu) veritabanlarını yedeklemeye çalışan bir iş parçacığı oluşturuyordu.

Ancak - sorun hala devam ediyor ve her hafta yeniden başlamamız, birkaç gün vermemiz veya almamız gerekiyor. Işık tutabileceklerini görmek için Rackspace ekibiyle birlikte çalışmak.


1
Tam bir soruyu işaret ediyor, ancak 16 GB RAM'in 1200 veritabanı için yeterli olmayabileceğini düşündünüz mü?
Nick Vaccaro

Pek çok şeye yardımcı olamıyorum ama MSSQL'in mümkün olduğu kadar RAM tüketmek üzere tasarlandığını biliyorum. Bu, gerçekten RAM'in boşa harcanacağının olduğu gibi anlam ifade eder. Yeniden başlattıktan kısa bir süre sonra 15GB’a sıçraması aslında başlı başına bir sorun değil. Ancak @Norla, 16'nın yapmak istedikleriniz için yeterli olmadığı konusunda haklı olabilir.

Yavaşlık sırasında kaç tane SPID aktif? Sp_who2'yi çalıştırın ve lütfen satır sayısını verin.
Nick Vaccaro

Sadece kontrol - Çalışmakta olan herhangi bir SQL server işi var mı? Bunlardan herhangi birinin bu soruna neden olup olmadığını görmek için onları birer birer durdurabilir misiniz?

Çıktısı nedir: sys.dm_os_memory_clerks seçin SUM (single_pages_kb + multi_pages_kb) /1024.0 burada [adı] = 'TokenAndPermUserStore'
Mark Katlı-Smith

Yanıtlar:


7

Her şeyin yolunda olduğunu söylüyorsunuz, ardından birkaç hafta sonra performans düşüyor. (Genellikle, insanlar performansın hızlı bir şekilde veya belirli zamanlarda veya görünüşte rastgele aralıklarla düştüğünü iddia ederler. Bu kötü G / Ç performansı anlamına gelebilir veya kötü zamanlarda çalışan fırtınaları veya yoğun işlemci gerektiren sorguları ya da ağır programlanmış bir işi ya da eksikliği CPU yoğun sorgulamalar veya disk okur ya da diğer şeyler neden olan indeksleme veya kötü istatistikler.) Haftalar olağandışı.

Hipotezim, sunucunuzdaki başka bir uygulamanın belleği sızdırıyor olmasıdır. Bunu virüs yazılımı (her DBA'nın favori sunucu yazılımı canavarı) ve 3. parti izleme yazılımı ile gördüm. Zaman içinde SQL Server'ın bellek kullanımını iki kez kontrol ederdim ve diğer tüm uygulamaların bellek kullanımını da kutuda tutardım. SQL Server'ın bellek kullanımında ayarlanmış zor sınırlarınız varsa ve sayfalamaya izin vermeyecek şekilde ayarladıysanız, sayfalanan ve G / Ç kapasitesi tüketen diğer uygulamalar olabilir.

Aramak zor değil. Eğer zaten ölçümleri sunucuda tutmuyorsanız, sadece Perfmon'u başlatır ve her 30 veya 60 dakikada bir örnek alırım. Birkaç gün sonra, diğer uygulamaların hafıza kullanımının yukarı doğru kaydığını görebilirsiniz.

SQL Server günlüğünde "önemli sql sunucusu bölümlerinin çıkarılmış olduğunu" belirten hata mesajları var mı? Bu da büyük bir ipucu olurdu.


katılıyorum, davranış, bellek sızıntısı gibi görünmesini sağlıyor.
Nick Kavadias

+1 Bellek sızıntısı için. Bu sunucuda sayfanın kullanım ömrünün çok uzun olduğundan şüpheliyim, ancak sayfa dosyasının hızla büyümesini sağlamamalı. Bilginize, burada neredeyse aynı konu (sorun AV oldu): social.msdn.microsoft.com/Forums/en/sqlsetupandupgrade/thread/…
brian

5

Sadece 16 GB RAM'e sahip tek bir SQL server örneğinde 1200 DB çalıştırabildiğiniz ve sizi birkaç hafta sorunsuz çalıştıktan sonra bu tür sorunlara sahip olduğunuz için tebrik etmeme izin verin. Yerel PASS bölümünde anlatmak için güzel bir hikaye.

Şimdi sorun gidermek için: RAM'iniz hem SQL hem de OS için 16 GB'dir. Maksimum bellek ayarınızın 15 GB veya maks. Bu, arabellek havuzunun tüm belleği kullanmasına ve işletim sistemini boğmasına neden olabilir. Tampon havuzunu ve önbellekleri temizlemenin herhangi bir farklılık göstermediğini söylüyorsunuz, artı PLE'niz 300'ün üzerinde. Bu, bellek şişesi boyunlarına karşı tanıklık ediyor. Sunucudaki CPU ve IO nasıl (özellikler / istatistikler)?

Çalıştırın select * from sys.dm_exec_request where session_id>50 and session_id<>@@spidve gördüğünüz kaynak içeriği nedir (wait_type, wait_time, last_wait_type, wait_resource).


1200 sooo fena değil! En büyük engel, bağlantı dizgisinin master olarak ayarlanmasıyla çözülen bağlantı havuzu sorunlarının üstesinden gelmek ve ardından bağlantıdan sonra bir USE [DBName] oldu. Sorgu açısından, sys.dm_exec_requests arasından * seçimini yaptım, burada session_id> 50 ve session_id <> @@ spid, ve 4-5 istekten oluşan kısa bir liste, listeyi tipik olarak 500 ms içinde bırakırlar. Ama yavaşladığımızda bunu deneyeceğim, Pazar günü yeniden başladı, bu yüzden her zamanki gibi uğultu.
PaulJ

@PaulJ, bağlantı havuzu oluşturmaya ilişkin ipucu için teşekkür ederiz. Şimdi biraz okuma yapıyorum.
StanleyJohns

5

1200 veritabanları, bir os ve muhtemelen başka şeyler? Evet, bence sunucunun kendisinin çalışması için 1 gb'den fazla ram'a ihtiyaç duyacağını düşünüyorum, özellikle de 15 gb'yi SQL Server'ın maksimum bellek ayarı olarak ayarlarsanız, o konu için 15 gb'nin dışında ek belleğe ihtiyaç duyuyor .

Sunucuyu biraz daha soluma odası bırakmak için SQL Server'ı 14GB'a düşürdüm.

Ayrıca, 16 GB RAM ile üçüncü bölüm yedekleme yardımcı programına sahip bir SQL Server 2008 x64 sistemindeki bellek ödenekleri için "Professional SQL Server 2008 Dahili ve Sorun Giderme" de verilen bir örnek:

  • Windows için 2 GB
  • İşçi konuları için 1GB
  • MPA'lar için 1GB, vb.
  • Yedekleme programı için 1GB
  • SQL Server için 11 GB

Kitapta, sahip olabileceğiniz maksimum iş parçacığı sayısının nasıl belirleneceği ve ne kadar hafıza kullanacakları hesaplanır. Konu başlığının ne kadar belleğe ihtiyacı olacağını bulmak için bunu çalıştırın (sunucunuzu eşleştirmek için sunucu türünü değiştirin).

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

harika şeyler, teşekkürler. 14 GB'a düşürdüm. Burada yeni bir şey öğrendim, çünkü her zaman SQL Server'ın istediğini almasına izin verdim. Bunun için başvuruda bulunmak için bir başka iyi yazı: sqlservercentral.com/blogs/glennberry/2009/10/29/…
PaulJ

4

Veritabanı belleği tüm veritabanlarına eşit olarak dağıtılmışsa, her bir veritabanı için yalnızca 12.8 Megs (15 * 1024) /1200=12.8 vardır. Daha fazla belleğe ihtiyacın var.

Performansın neden yavaşladığını araştırmanız gerekiyor. Kilitleme, engelleme vb. Görüyor musunuz? Bekleme istatistikleri neye benziyor?


3

DBCC komutları yalnızca belleği tekrar işletim sistemine bırakmayacakları bellek tamponlarını siler.

SQL Server'ın aslında belleği harcadığını biliyor musunuz? SQL Server'ın ne yaptığını ve üzerinde çalıştığını bulmak için yeniden başlatıldıktan sonra Perfmon oturumu kurmayı veya DMV bilgilerini toplamaya başlamanızı öneririm. Ayrıca, kullanıcılar toplama süreniz boyunca normalden daha fazla iş yapıyorsa (Ay Sonu işleme vb.) Dikkat edin. Aynı sunucuda SSRS, SSIS veya SSAS kullanıyor musunuz?

Sistemde 1200 veritabanınız var, sahip olduğunuz en büyük DB nedir?


en büyük db 5 GB'dir. Sadece ~ 25 tanesi 1GB ya da daha fazlasıdır. Büyük çoğunluğu 50 ila 200 MB'dir.
PaulJ

"Aynı sunucuda SSRS, SSIS veya SSAS kullanıyor musunuz?" - Bu servislerden hiçbirini yürütmemek. Saf bir sql kutusu.
PaulJ
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.