SQL performansını artırmak için, neden daha hızlı sabit disklere sahip olmak yerine sadece çok fazla RAM koymuyorsunuz?


31

İnsanlar bana bir SQL sunucunun performansını iyileştirmek için RAID 5 vb. İle mümkün olan en hızlı sabit diskleri satın aldıklarını söyleyip duruyorlar.

Bu yüzden, bütün parayı RAID 5 ve süper-duper hızlı sabit diskler (bu arada ucuz olmayan) için harcamak yerine neden sadece tonlarca RAM almıyordum? Bir SQL sunucusunun veritabanını belleğe yüklediğini biliyoruz. Bellek, herhangi bir sabit diskten daha hızlı.

Bir sunucuda neden 100 GB RAM doldurmuyorsunuz? O zaman RAID 1 ile normal bir SCSI sabit disk kullanın. Bu çok daha ucuz ve daha hızlı olmaz mıydı?


33
Size kim söylüyorsa RAID 5'in hiçbir fikri yoktur. Performansı gerçekten önemsiyorsanız, RAID 10
MDMarra

5
ACID'deki D ne anlama geliyor? Sonunda, bir şeyler yazman gerekecek.
Adam Musch,

Yanıtlar:


51

Analiziniz gayet iyi - bir noktaya - kesinlikle işleri daha hızlı yapacağına. Yine de birkaç sorunu hesaba katmak zorundasınız:

  1. Herkes yeterince hatıra alamaz; Birden fazla terabayt veriye sahipseniz, bir süre için bunu diske yerleştirmeniz gerekir. Çok fazla bilginiz yoksa, her şey yeterince hızlı.

  2. Veritabanınız için yazma performansı hala diskler tarafından kısıtlanmaya devam edecek, böylece verilerin gerçekte depolandığı sözünü tutabilirsiniz.

Küçük bir veri kümeniz varsa veya diskte sürdürmeniz gerekmiyorsa, fikrinizde yanlış bir şey yoktur. VoltDB gibi araçlar , saf bellek performansını sınırlayan RDBMS uygulamalarında eski varsayımların yaptığı genel giderlerin azaltılmasına çalışıyor.

(Bir kenara, size veritabanı performansı için RAID-5'i kullanmanız gerektiğini söyleyen insanlar muhtemelen konu hakkında dinlemeniz iyi bir insan değil, çünkü neredeyse hiç iyi bir seçenek değil - iyi bir okuma performansı var, ancak kötü yazma performansı var ve yazıyor neredeyse her zaman üretim kısıtlamasıdır - çünkü çoğu okuma tarafı performans sorununu çözmek için RAM'i önbelleklemeye atabilirsiniz.)


1
Genel kullanıcılar daima okuma sorunlarını şikayet eder. Nadiren yazma sorunları hakkında
user1034912

2
@ user1034912 - kullanım durumuna ve kullanıcılara göre değişir. Genel olarak, yazma performans sorunlarının çözülmesi daha zordur ve sonuçta genel sistem performansına daha fazla kısıtlamalar getirmektedir, bu da okuma problemini
çözdüğünüzde

2
@ user1034912, kullanıcılar normalde yazma gecikmelerini görmezler, bu yüzden onlardan habersizler. Kullanıcıların okuma gecikmeleri olarak gördüklerinin çoğu, yavaş diskler değil, yavaş sorgular nedeniyledir.
John Gardeniers

Mükemmel bir cevap! @ user1034912, elbette, zayıf yazma performansının (ve zayıf ölçeklendirme eşzamanlılık kodunun) etkisiz bir etkisi olabilecek okuma sorunlarından şikayet edebilirler.
Alex,

İlişkisel Veritabanlarında RAID5: en.wikipedia.org/wiki/… - Yanıldığını söylemiyorum, ancak geleneksel bilgelik eski bilgilere dayanıyor olabilir. Şahsen ben artık RAID5 kullanmıyorum; Çok yavaş olmadığı sürece RAID6 kullanıyorum.
gWaldo

11

Kısa versiyon: çalışan set boyutunu düşünün. Uzun versiyon: Verileriniz ne kadar büyük? Modern bir sunucunun hafızasına sığabilirse, evet, kesinlikle haklısın. Ne yazık ki, en büyük Xeon şu anda 2 TB RAM'e hitap edebiliyor ve bu artık bir veri kümesi için büyük değil. Tüm çalışma setinizi RAM'e yerleştirecek kadar büyük makine satın alamazsanız, cüzdanınızla değil beyninizle sorunları çözmek zorunda kalırsınız.


Son cümle için +1 son derece alıntı yapılabilir. : D
pkoch

8

Hız istiyorsan:

  • RAM'i artırın, böylece en azından sık kullanılan dizinler tamamen RAM'e sığabilir (örneğin, üzerinde çalıştığım bir sistemde, 32GB RAM 350GB'lık bir veritabanı için yeterlidir, çünkü dizinler ham verilerde değil RAM'de ihtiyacınız olan şeydir)
  • RAID10'u herhangi bir diskle kullanın (daha hızlı diskler daha iyidir)
  • RAID5'ten Kaçının
  • Ayrık iş mili kümelerine mdf, ldf ve temp DB'yi ayırın (örnek: kendi RAID1 kümesinde tempdb, kendi RAID1 veya RAID10 iş mili kümesinde ldf, en az 4 toplam disk içeren RAID 10 kümesinde mdf)

Bu adımları izleyin ve SQL Server uçacak.

O zaman istersen, daha fazla RAM ekle ... ama ilk önce yukarıdakileri yap, ve işini bitirdiğini görebilirsin.


2

RAM yeni disktir, disk yeni banttır.

In http://www.tbray.org/ongoing/When/200x/2006/05/24/On-Grids . Altı yıl önceydi. Evet, tüm veri setini RAM'de tutmayı deneyen (ve çok deneyen) veri tabanı sistemlerine sahibiz ve diski kullanmaktan ziyade diski kullanmaktan ziyade diskler zaten daha yavaş. Veri kümesini diske yazmanız gerekir, ancak yukarıdaki sloganda olduğu gibi, bu bir çevrimiçi işlemden ziyade arka plan yedekleme görevine benzer. Dayanıklılık, yalnızca bu veritabanları olan günlükleri ekleme yoluyla elde edilir (MongoDB ve Redis'i düşünüyorum, ancak daha fazlası var).


4
-1 çünkü bu kadar güzel, çoğu uygulama için veya buradaki çoğumuz için gerçekten erişilebilir değil. 500gb'a kadar veri için (veya daha fazlası), tek ihtiyacınız olan iki SQL Sunucusu (birincil ve yedekleme) ve yüzlerce veya binlerce kullanıcı için normal araçları kullanarak gerçekten hızlı bir şekilde sahip olmalısınız. Çok azımızın yüz binlerce eşzamanlı kullanıcı veya birden fazla veri merkezine ölçeklendirilmesi gerekiyor, bu nedenle önerilen yaklaşımınızın karmaşıklığı çoğumuz için çok daha ağır basıyor. IOW: Dikey ölçeklendirme facebook veya google olmayan herkes için kolay, ucuz ve etkilidir.
Jonesome Monica

1

Bu soru, son 5-10 yıl boyunca veritabanı mimarisinde çok sayıda araştırma ve geliştirmeye yol açan temel soruya benzer. Artık birçok kullanım durumunda bütün bir veri tabanını RAM'de saklamak mümkün olduğu için, veritabanının sadece eski miras alan mimarileri RAM tabanlı depolamaya uygulamak yerine RAM'de çalışmak üzere tasarlanması gerekir.

Son yıllarda çok daha küçük ve daha özel amaçlı dillerin yaygın olarak benimsenmesi gibi bir döneme giriyoruz, daha özel amaçlı veritabanlarına ihtiyaç duyulacak.

Bu konuyla ilgili daha fazla okuma için, bir akademik dönemin mimari bir dönemin sonu (tam bir yeniden yazma zamanı) ' nı öneririm . Zor bir okuma değil.

Bu sorunun özellikle SQL Server ile ilgili olup olmadığı belli değil. Orijinal poster bunu açıklığa kavuşturmalıdır.

Daniel Pittman şunu yazdı:

Küçük bir veri kümeniz varsa veya diskte sürdürmeniz gerekmiyorsa, fikrinizde yanlış bir şey yoktur. VoltDB gibi araçlar, saf bellek performansını sınırlayan RDBMS uygulamalarında eski varsayımların giderdiği ek yükleri azaltmaya çalışıyor.

RDBMS uygulamalarında genel giderlerin eski varsayımlardan düşülmesi , tam olarak VoltDB'nin tasarım amacıydı , ancak veri boyutunda mimari sınırlama olmadan yatay olarak ölçeklendi ve anlık görüntü ve komut günlüğü kullanarak tam dayanıklılık için diske devam edebilir.


0

Yeterli RAM’e sahip bir sunucuya sahipseniz, en azından veri kümenizin sıcak kısmını kullanabilirsiniz. Ayrıca, RAID 1 ve 5 verilerinizi düzenlemenin en hızlı yolu değildir - RAID 0 daha hızlıdır, ancak daha sonra, veritabanınızı silen bir dosya sistemi hatasının daha yüksek ihtimalini göz önünde bulundurmanız gerekir - bunun gerçekleşmesi iyi bir şey değil . RAID 0 dizinizi RAID 1 veya RAID 5'iniz yeterli sürücü ve denetleyiciniz olması koşuluyla yapabilirsiniz.

Burada çoğaltmayla bile oynayabilirsiniz - yazılarınızı karmaşık sorguları çalıştırdığınız bir veya daha fazla bellek ağırlıklı sunucuya çoğaltan disk ağırlıklı bir sunucuya yazarsınız.

Ne yazık ki, RDBMS'lerin büyük demir aleminde olduğu görülüyor - yatay olarak büyümesi kolay değil.


0

Bu, "ne yaptığınıza bağlı." Durumudur. Belki de "doğru" tavsiye SQL'i tamamen önlemek ve memcache / redis / etc kullanmaktır!

Özellikle RAM'in tamamını çalıştırabilirseniz, ekstra RAM'in çok yardımcı olacağı konusunda size katılıyorum. Evet, yine de veri yazmak zorunda kalacak, ancak çoğunlukla okuduysanız yazarın disk G / Ç için çekişmesi olmayacaktır.

Ancak, disk performansı genellikle SQL sunucularda bir tıkanıklıktır ve daha sonra yükseltmek için RAM gibi diğer işlemlerden daha zordur (DIMM'lerle dolu olmayan bir sunucunuz varsa).

RAID5'in yavaş olduğu ile ilgili çok sayıda yorum vardı, ancak bunun her zaman böyle olmadığını söyleyebilirim, bu yüzden kapsamlı açıklamalar yapmadan önce dikkatli olun. Hızlı RAID kartlarına ve çok sayıda BBWC'ye sahip olan gerçekten yüksek kaliteli sunucular bazen RAID5'te (veya> 4 diskli RAID50'de) RAID10'da olduğundan çok daha hızlı ...

Yıllar boyunca kişisel olarak yavaş RAID5 dizileri deneyimledim, ancak ~ 2009'da 4 146G SAS diskleri olan bir DL360 G5'i karşılaştırdıktan sonra, testlerimizi iki kez kontrol etmek zorunda kaldık. Nitekim, dizi neredeyse her testte RAID5 ile RAID10'dan daha hızlı gitti. BBWC ve hızlı eşlik hesaplamaları, sunucunun 4 diski RAID10 dizisinden RAID5 dizisi olarak çok daha etkili bir şekilde kullanmasını sağlamıştır. Testlerin bazıları RAID5 ile% 50 daha iyi verim gösterdi ve neredeyse hiçbiri yavaş değildi. Daha yavaş olan testler sadece% 5-10 indirimdeydi.

RAID5'in yavaş olduğunu söyleyen battaniye ifadeleri yapan insanlara uyardım, herkes çevrimiçi diyor, ancak her durumda doğru değil.


-1

Seçebileceğiniz bir şekerleme karışımı çantanız var ve bu da gerçekten istediğiniz lezzetin ne olduğuna bağlı.

  1. DB'lerin sorguları önbelleğe almak için yapılandırması ve bu önbelleğin bulunduğu yer, bellek veya sabit sürücü olacaktır.
  2. RAID 5 her zaman en hızlı değildir, ancak RAID 0 (JBOD) bir şerittir ve hızlıdır, çünkü RAID 5 de bir şerit olduğu için fikir aynıdır.
  3. RAID 1 hızınızı arttırmaz, sadece bir aynadır.
  4. SQL performansı İndekslemeye dayanmaktadır ve kontrol edilecek ilk şeydir. İlişkisel veritabanlarında çok önemlidir.
  5. Her şeyi indeksleme, fazla indeksleme hızı da azaltabilir çünkü indekslemeniz aşırı yüklenir.
  6. Bazen SQL Joins ile veritabanı yavaşlar. Bir dizi minimal indekslenmiş sonuç döngüsü için programlama kullanmak hızı arttırır.
  7. Dolar ödemezseniz Sanal Sunucular hızlı bir kabus.

Nakit para vermeden önce basitçe bilgiye yatırım yapın. 1. Veritabanınız için konfigürasyonları öğrenin ve optimize etmek için mevcut konfigürasyonunuza bakın. 2. Programlama ve sql ifadelerine, ilgili işlemleri taklit eden basit senaryolarla birim testine bakın, konu hakkında düşündüğünüz şey olmayabilir. Eğer basit scriptler SQL Joins kullanarak zaman alırsa, bölün ve aynısını yapmak için programlanmış bir döngü ile aynı şeyi yapın. Bu yardımcı olabilir bellek 3 idi. Hosting planı ve sunucuya bakın. Linux konsolunda ps aux kullanın ve belleğinizi ve işlemcinizi emen bir şey olup olmadığına bakın.

Mutlak Sabit Sürücü hızı artırır, ancak sanal bir sunucu alanında size bağlı değildir. Hizmetleri, hizmet için yapılandırmadıysanız, bellek hızı artırmaz. Çizgili RAID (0,5), RPM ve Senkronize Okuma / Yazma ile hızlı veriyolu buna yardımcı olur. İyi l1, l2, l3 önbellekli çekirdek işlemci, darboğazı işlemeye yardımcı olacaktır. Xeon için duyabilir miyim!


2
RAID1, okuma durumlarında kesinlikle hızı artıracaktır. Çoğu denetleyici (aynı) veri kümesinden aynı anda okumak için birden fazla iş mili kullanacak kadar akıllıdır. RAID0 kötü bir fikir çünkü her seferinde bir iğ ile sınırlısınız.
Bryan Boettcher

-4

Genel olarak, boyut ve ölçeklenebilirliği göz önünde bulundurmalısınız. Küçük depolama ihtiyaçlarıyla başlamış görünüyorsanız da, verileriniz çok hızlı ve katlanarak artacaktır. DB'ler, mümkün olan en küçük boyuta bölünmüş veriler olan atomik verileri kullanır. Küçük boyutu nedeniyle, veri ambarında daha hızlı hareket eder. Ardından, DB yapısını da hesaba katarsınız. Gelecekte, dış DB'lere bağlanıyor olabilirsiniz, bu yüzden yapı da çok önemlidir. Bu senaryoda, verilerin yarısı data mart'ınızın dışında kalıyorsa sorgunuz için çok az fark yaratacaktır. Veriler sorgulandığında, amaç RAM'deki verileri saklamak değildir; bunun yerine, sorgunun verilere erişme ve vermede hızlı olması gerekir.

  • Gerçekten her zaman veriler için RAID 5 kullanmazsınız. Daha önce yedekler hakkında bahsettiğimin yanı sıra verilere ve önemine bağlıdır. RAID 1 kullanılabilir ve kullanılır.
  • Hızı artırmak için, sorgu aralığınızdaki tüm sunucuları yükseltmeniz gerekir. Verilerin çoğu kontrolünüzün dışında olduğundan, veri martınızın dışında bir yerde tıkanıklık olacak. (Kendinizinkini yükseltmeniz durumunda)

Vay canına, ders kitaplarından yanlış anladın mı?
13.01 13.01'de

Ugh. İnsanlara RAID'in bir yedekleme çözümü olmadığı kaç kez söylenmelidir?
Cromulent
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.