RAM Disk üzerinde SQL Server tempdb?


11

Satıcı uygulama veritabanımız TempDB yoğun.

Sunucu, SQL 2012 Enterprise SP3 çalıştıran 40 çekirdekli ve 768 GB RAM ile sanaldır (VMWare).

TempDB dahil tüm veritabanları SAN'da Tier 1 SSD üzerindedir. Her biri 1 GB'a kadar büyütülmüş ve hiçbir zaman otomatik olarak büyümeyen 10 tempdb veri dosyasına sahibiz. 70 GB günlük dosyasıyla aynı. İzleme Bayrakları 1117 ve 1118 zaten ayarlanmış.

sys.dm_io_virtual_file_stats 250 ay veya 10 günlük kümülatif io_stall ile geçen ay tempdb veri ve günlük dosyalarında okunan / yazılan 50'den fazla Terabayt gösterir.

Son 2 yıldır satıcının kodunu ve SP'lerini ayarladık.

Şimdi, ton belleğimiz olduğundan tempdb dosyalarını RAM Sürücüsüne yerleştirmeyi düşünüyoruz. Sunucu yeniden başlatıldığında tempdb imha edildiğinden / yeniden oluşturulduğundan, sunucu yeniden başlatıldığında temizlenen geçici belleğe yerleştirmek için ideal bir adaydır.

Bunu daha düşük bir ortamda test ettim ve daha hızlı sorgu süreleriyle sonuçlandı ancak CPU kullanımı arttı, çünkü CPU yavaş tempdb sürücüsünde beklemek yerine daha fazla iş yapıyor.

Başkaları tempdb yüksek oltp üretim sistemlerinde RAM koymak? Büyük bir dezavantaj var mı? Özellikle seçmek veya kaçınmak için herhangi bir tedarikçi var mı?


Belki satıcınız çok fazla tempDB kullanıyor?
paparazzo

@Max, bu soru sorunun sadece 'tempdb yazıyor diske gidip gitmediğini' yanıtlıyor .. tempdb'den okumayan
d -_- b

1
SSD'yi SAN düzeyinde kullanmak, ağ gecikmesi nedeniyle size çok fazla avantaj sağlamaz. SQL Server'a bir NVMe SSD yerleştirin ve üzerinde tempdb çalıştırın.
Max Vernon

Ben sadece 'nvme ssd vs ramdisk' googled ve ilk sonuç ikincisinin ~ 3 kat daha hızlı olduğunu iddia eden bir reddit gönderi. Ayrıca veri merkezine sürmekten ve bıçağa takmaktan daha kolaydır :)
d -_- b

2
Microsoft, bazı kümelerinde PCI-E FusionIO kartlarını kullanır (tempdb'yi kullandıkları yerel disklerle kullanmaya devam edebileceğiniz küçük bir geçici çözüm vardır). Max'in işaret ettiği gibi PCI-E arayüzü oldukça hızlı. Saniyede daha fazla istek alıp almadığınızı ölçmek için saniye başına CPU kesintilerini ölçmek isteyeceksiniz. Disk gecikmesi, düşük kesme isteklerinin (SQL zamanı değil) ana nedenlerinden biri olması gerekir.
Ali Razeghi

Yanıtlar:


7

İlk olarak, yama: 2012 Service Pack 1 Toplu Güncelleştirme 10 veya daha yeni bir sürümde olduğunuzdan emin olun. SQL 2014'te, Microsoft olmak TempDB değişti diske yazmaya daha az istekli ve onlar Dehşet 2012 SP1 10 PB bunu backported o TempDB yazma çok baskı hafifletmek, böylece.

İkincisi, gecikmenizde kesin rakamlar alın. TempDB dosyalarınızın ortalama yazma duraklarını görmek için sys.dm_io_virtual_file_stats öğesini kontrol edin . Bunu yapmanın en sevdiğim yolu ya:

sp_BlitzFirst @ExpertMode = 1, @Seconds = 30 /* Checks for 30 seconds */
sp_BlitzFirst @SinceStartup = 1 /* Shows data since startup, but includes overnights */

Dosya istatistikleri bölümüne bakın ve fiziksel yazmalara odaklanın. SinceStartup verileri biraz yanıltıcı olabilir, çünkü CHECKDB'nin çalıştığı zamanları da içerir ve bu da TempDB'nizi gerçekten etkileyebilir.

Ortalama yazma gecikmeniz 3 ms'den fazlaysa, evet, SAN'ınızda katı hal depolama alanınız olabilir, ancak yine de hızlı değildir.

Önce TempDB için yerel SSD'leri düşünün. İyi yerel SSD'lerin (özellikle de tanımladığınız boyutlarda 2.000 ABD Doları'nın altındaki Intel'in PCIe NVMe kartları gibi), paylaşılan depolama ile elde edebileceğinizden daha düşük gecikme süresine sahiptir. Bununla birlikte, sanallaştırma altında bunun bir dezavantajı vardır: yükleme veya donanım sorunlarına tepki vermek için konuğu bir ana bilgisayardan diğerine vMotion yapamazsınız.

En son bir RAM sürücüsünü düşünün. Bu yaklaşımla iki büyük gotcha var:

İlk olarak, gerçekten ağır TempDB yazma etkinliğiniz varsa, bellekteki değişim o kadar yüksek olabilir ki, herkes fark etmeden konuğu bir ana bilgisayardan diğerine vMotion edemezsiniz. VMotion sırasında, RAM içeriğini bir ana bilgisayardan diğerine kopyalamanız gerekir. Gerçekten o kadar hızlı ve vMotion ağınız üzerinden kopyalayabileceğinizden daha hızlı değişiyorsa, sorun yaşayabilirsiniz (özellikle bu kutu yansıtma, AG'ler veya yük devretme kümesi ile ilgiliyse).

İkincisi, RAM sürücüleri yazılımdır. Yaptığım yük testinde, gerçekten ağır TempDB etkinliği altında hızlarından etkilenen tek şey olmadım. Kurumsal düzeyde bir SSD'nin devam edemeyeceği kadar ağırsa, RAM sürücü yazılımını da vergilendireceksiniz. Canlı yayına geçmeden önce bunu çok fazla test etmek isteyeceksiniz - hepsi de tempdb'de sıralama kullanarak farklı dizinlerde çok sayıda eşzamanlı dizin yeniden oluşturma gibi şeyleri deneyin.


1

Bir RAM sürücüsü oluşturmak önemsiz olmalıdır. Birçok önyüklenebilir Linux başparmak sürücüsü ve optik sürücü bir RAM sürücüsü oluşturur ve işletim sistemi dosyalarını burada saklar. Kök dosya sistemi bellekte kalır. Windows'da, o günlerde, config.sys'de bir aygıt sürücüsü olarak bir RAM sürücüsü yüklendi. Genellikle sürücü yüksek belleğe yüklenmiştir. Bence bu çok iyi ve basit bir çözüm. Çözümünüzü bir RAM sürücüsü kullanarak oluşturduysanız onu duymak isterim. Ben benzer bir şey yapmak istiyorum ama kalıcı depolama ve RAM bir db saklamak için yazmak istiyorum. Benim durumumda, işletim sisteminin kullanabileceğinden daha fazla RAM yükleyebilen makinelerimiz var. İşletim sistemi yüklemelerinden önce bir RAM diski oluşturmak işletim sisteminin aksi halde görmeyeceği RAM kullanımına izin verecektir.

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.