.NET 4.0'da geliştirdiğimiz ve arkada SQL Server 2008 R2 çalıştırdığımız bir OLTP sistemini test etmekle meşgulüz. Sistem, çok performanslı SQL Server Service Broker kuyruklarını kullanıyor, ancak işleme sırasında tuhaf bir trend yaşıyoruz.
SQL Server işlem istekleri 1 dakika boyunca bir kabarcık hızında, ardından ~ 20 saniye arttırılmış disk yazma etkinliği. Aşağıdaki grafik sorunu göstermektedir.
Yellow = Transactions per second
Blue = Total CPU usage
Red = Sqlsrv Disk Write Bytes/s
Green = Sqlsrv Disk Read Bytes/s
Sorun giderme sırasında, kalıpta önemli bir değişiklik yapmadan aşağıdakileri denedik:
- SQL Server Aracısı durduruldu.
- Neredeyse tüm çalışan işlemleri öldürdü (A / V, SSMS, VS, Windows Explorer vb. Yok)
- Diğer tüm veritabanları kaldırıldı.
- Tüm konuşma zamanlayıcıları devre dışı bırakıldı (tetikleyici kullanmıyoruz).
- İleti kuyruğu odaklı bir yaklaşımdan basit / ham bir tablo izleme tasarımına taşındı.
- Hafiften ağırya farklı yükler kullanılır.
- Tüm kilitlenmeler düzeltildi.
SQL Server önbelleğini oluşturuyor ve belirli zaman tabanlı aralıklarla diske yazıyor gibi görünüyor, ancak bu teoriyi desteklemek için çevrimiçi bir şey bulamıyorum.
Sonra, sorunu tekrar edip edemeyeceğimi görmek için çözümü özel test ortamımıza taşımayı planlıyorum. Aradaki herhangi bir yardım çok takdir edilecektir.
Güncelleme 1 İstendiği gibi, burada Kontrol Noktası Sayfaları / Saniye , Sayfa Yaşam Beklentisi ve bazı disk gecikme süresi sayaçlarını içeren bir grafikle .
Gözlemlediğimiz düşük performansın (sarı çizgi) Kontrol Noktası (açık mavi çizgi) gibi görünüyor.
Disk gecikmesi işleme sırasında nispeten tutarlı kalır ve sayfa ömrü beklentisinin gözle görülür bir etkisi yoktur. Ayrıca SQL Server için kullanılabilir olan ram miktarını da ayarladık, bu da büyük bir etkiye sahip değildi. Kurtarma modelini 'den' SIMPLE
e değiştirmek FULL
de çok az fark yarattı.
Güncelleme 2 "Kurtarma Aralığı" nı aşağıdaki gibi değiştirerek, kontrol noktalarının meydana gelme aralığını azaltmayı başardık:
EXEC sp_configure 'show advanced options',1
GO
RECONFIGURE
GO
EXEC sp_configure 'recovery interval', '30'
GO
RECONFIGURE
GO
EXEC sp_configure 'show advanced options',0
GO
RECONFIGURE
Bunun kötü bir uygulama olup olmadığından emin değilim?
FULL
veya içinde olsa bile BULK_LOGGED
, SIMPLE
tam bir yedekleme alıncaya kadar hala veritabanındaymış gibi davranacağını unutmayın.