Linux'ta SAS çoklu yolunu JBOD performansına geliştirme


10

Linux ile bazı Sun donanımlarında depolama kurulumunu optimize etmeye çalışıyorum. Herhangi bir düşünce büyük mutluluk duyacağız.

Aşağıdaki donanıma sahibiz:

  • Güneş Bıçağı X6270
  • 2 * LSISAS1068E SAS denetleyicileri
  • 1 TB diskli 2 * Sun J4400 JBOD (JBOD başına 24 disk)
  • Fedora Çekirdeği 12
  • 2.6.33 FC13'ten sürüm çekirdeği (ayrıca FC12'den en son 2.6.31 çekirdeği ile de denendi, aynı sonuçlar)

SAS donanımının veri sayfası:

http://www.sun.com/storage/storage_networking/hba/sas/PCIe.pdf

PCI Express 1.0a, 8x şerit kullanıyor. Şerit başına 250 MB / sn bant genişliği ile, SAS denetleyicisi başına 2000 MB / sn yapabilmemiz gerekir.

Her denetleyici port başına 3 Gb / sn yapabilir ve iki adet 4 portlu PHY'ye sahiptir. Her iki PHY'yi bir denetleyiciden bir JBOD'ye bağlarız. JBOD ve kontrolör arasında PCI Express bant genişliğinden daha fazla olan 2 PHY * 4 SAS portu * 3 Gb / sn = 24 Gb / sn bant genişliği var.

Yazma önbelleği etkinken ve büyük yazma işlemleri yaparken, her disk yaklaşık 80 MB / sn (diskin başlangıcına yakın) sürebilir. 24 disk ile, JBOD başına 1920 MB / sn yapabilmemiz gerekir.

çoklu yol {
  rr_min_io 100
  uid 0
  path_grouping_policy multibus
  geri dönme kılavuzu
  yol_selektörü "round-robin 0"
  rr_weight öncelikleri
  takma ad somealias
  yol_tekrar kuyruğu yok
  mod 0644
  gid 0
  biraz geniş
}

Rr_min_io için 50, 100, 1000 değerlerini denedim, ancak çok fazla bir fark yaratmıyor gibi görünüyor.

Değişen rr_min_io ile birlikte tüm aynı PHY üzerinde aynı anda yazma önlemek için dd başlatmak arasında bazı gecikme ekleyerek çalıştı, ama bu herhangi bir fark yaratmadı, bu yüzden I / O düzgün yayılıyor düşünüyorum.

/ Proc / interrupts'a göre, SAS denetleyicileri bir "IR-IO-APIC-fasteoi" kesme şeması kullanır. Herhangi bir nedenden ötürü, makinedeki sadece çekirdek # 0 bu kesintileri ele alıyor. Her SAS denetleyicisinin kesintilerini işlemek için ayrı bir çekirdek atayarak performansı biraz artırabilirim:

echo 2> / proc / irq / 24 / smp_affinity
echo 4> / proc / irq / 26 / smp_affinity

Diske yazmak için dd kullanıldığında, çekirdek # 4 tarafından işlenen "İşlev çağrısı kesmeleri" (bunların ne olduğu hakkında bir fikir yok) oluşturur, bu yüzden diğer işlemleri de bu çekirdekten uzak tutarım.

Ben 48 dd's (her disk için bir tane) çalıştırmak, böyle kesintiler ile uğraşmayan çekirdeklere atama:

görevler -c = / dev / sıfır = / dev / mapper / mpathx oflag = doğrudan bs = 128M

oflag = direct her türlü arabellek önbelleğinin dahil olmasını engeller.

Çekirdeklerimin hiçbiri azami gibi görünmüyor. Kesintilerle uğraşan çekirdekler çoğunlukla boştur ve diğer tüm çekirdekler beklendiği gibi G / Ç'de bekler.

Cpu0:% 0.0 us,% 1.0 sy,% 0.0 ni,% 91.2 id,% 7.5 wa,% 0.0 hi,% 0.2 si,% 0.0 st
İşlemci1:% 0.0 us,% 0.8 sy,% 0.0 ni,% 93.0 id,% 0.2 wa,% 0.0 hi,% 6.0 si,% 0.0 st
İşlemci2:% 0.0 us,% 0.6 sy,% 0.0 ni,% 94.4 id,% 0.1 wa,% 0.0 hi,% 4.8 si,% 0.0 st
İşlemci3:% 0.0 us,% 7.5 sy,% 0.0 ni,% 36.3 id,% 56.1 wa,% 0.0 hi,% 0.0 si,% 0.0 st
Cpu4:% 0.0 us,% 1.3 sy,% 0.0 ni,% 85.7 id,% 4.9 wa,% 0.0 hi,% 8.1 si,% 0.0 st
İşlemci5:% 0.1 us,% 5.5 sy,% 0.0 ni,% 36.2 id,% 58.3 wa,% 0.0 hi,% 0.0 si,% 0.0 st
İşlemci6:% 0.0 us,% 5.0 sy,% 0.0 ni,% 36.3 id,% 58.7 wa,% 0.0 hi,% 0.0 si,% 0.0 st
Cpu7:% 0.0 us,% 5.1 sy,% 0.0 ni,% 36.3 id,% 58.5 wa,% 0.0 hi,% 0.0 si,% 0.0 st
İşlemci8:% 0.1 us,% 8.3 sy,% 0.0 ni,% 27.2 id,% 64.4 wa,% 0.0 hi,% 0.0 si,% 0.0 st
İşlemci9:% 0.1 us,% 7.9 sy,% 0.0 ni,% 36.2 id,% 55.8 wa,% 0.0 hi,% 0.0 si,% 0.0 st
İşlemci10:% 0.0 us,% 7.8 sy,% 0.0 ni,% 36.2 id,% 56.0 wa,% 0.0 hi,% 0.0 si,% 0.0 st
İşlemci11:% 0.0 us,% 7.3 sy,% 0.0 ni,% 36.3 id,% 56.4 wa,% 0.0 hi,% 0.0 si,% 0.0 st
Cpu12:% 0.0 us,% 5.6 sy,% 0.0 ni,% 33.1 id,% 61.2 wa,% 0.0 hi,% 0.0 si,% 0.0 st
Cpu13:% 0.1 us,% 5.3 sy,% 0.0 ni,% 36.1 id,% 58.5 wa,% 0.0 hi,% 0.0 si,% 0.0 st
Cpu14:% 0.0 us,% 4.9 sy,% 0.0 ni,% 36.4 id,% 58.7 wa,% 0.0 hi,% 0.0 si,% 0.0 st
İşlemci15:% 0.1 us,% 5.4 sy,% 0.0 ni,% 36.5 id,% 58.1 wa,% 0.0 hi,% 0.0 si,% 0.0 st

Tüm bunlar göz önüne alındığında, "dstat 10" çalıştırılarak bildirilen verim 2200-2300 MB / sn aralığındadır.

Yukarıdaki matematik göz önüne alındığında, 2 * 1920 ~ = 3600+ MB / sn aralığında bir şey beklenir.

Kayıp bant genişliğimin nereye gittiğine dair bir fikri olan var mı?

Teşekkürler!


LSI SAS Denetleyicilerinin önbelleği Yazma olarak mı ayarlanmış? (büyük ardışık iş yükleri için geri yazma daha yavaş olacaktır). Ayrıca ds için daha küçük bir bs ile test etmek isteyebilirsiniz, bs = 1M gibi.
Brian

Yanıtlar:


1

Güzel, iyi hazırlanmış bir soru :)

Ben bir süratli adamım ve ben dürüst olmak için para içindeyim. Veriminizi yarıdan daha düşük görmeyi bekliyordum ama sanırım orada küçük ve beklenen verimsizliğin artması var. Örneğin, bir PCIe veri yolunun her zaman% 100'e ulaşması çok zordur, genel olarak% 90'lık düşük bir oran varsaymak daha iyidir. Titreşim göz önüne alındığında, PHY'lerin her zaman% 100 `` beslenmeyeceği '' anlamına gelir, böylece önbellek, diskler, kömürleşmemiş kesintiler, G / Ç zamanlaması vb. İçin biraz orada kaybedersiniz. küçük verimsizlik süreleri küçük verimsizlik süreleri ... ve böylece, kendi başına beklenen% 5-10'dan fazla verimsizliğe neden olur. HP DL sunucularında W2K3 kullanarak MSA SAS kutularıyla konuşurken ve sonra NLB olarak bu tür bir şey gördüm. Birden fazla NIC üzerinde ed - sinir bozucu ama anlaşılır sanırım. Bu zaten benim 2c, çok olumlu değil üzgünüm.

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.