Meningkatkan kinerja SAS multipath ke JBOD di Linux

10

Saya mencoba untuk mengoptimalkan pengaturan penyimpanan pada beberapa perangkat keras Sun dengan Linux. Pikiran apa pun akan sangat dihargai.

Kami memiliki perangkat keras berikut:

  • Sun Blade X6270
  • 2 * pengendali LSISAS1068E SAS
  • 2 * Sun J4400 JBODs dengan 1 TB disk (24 disk per JBOD)
  • Fedora Core 12
  • 2.6.33 rilis kernel dari FC13 (juga mencoba dengan kernel 2.6.31 terbaru dari FC12, hasil yang sama)

Berikut datasheet untuk perangkat keras SAS:

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

Ini menggunakan PCI Express 1.0a, 8x jalur. Dengan bandwidth 250 MB / detik per lajur, kita harus dapat melakukan 2.000 MB / detik per pengontrol SAS.

Setiap pengontrol dapat melakukan 3 Gb / detik per port dan memiliki dua 4 port PHY. Kami menghubungkan kedua PHY dari pengontrol ke JBOD. Jadi antara JBOD dan pengontrol kami memiliki 2 PHYs * 4 port SAS * 3 Gb / detik = 24 Gb / detik bandwidth, yang lebih dari bandwidth PCI Express.

Dengan caching tulis diaktifkan dan saat melakukan penulisan besar, setiap disk dapat mempertahankan sekitar 80 MB / detik (dekat awal disk). Dengan 24 disk, itu artinya kita harus mampu melakukan 1920 MB / detik per JBOD.

multipath {
  rr_min_io 100
  uid 0
  path_grouping_policy multibus
  manual failback
  path_selector "round-robin 0"
  rr_weight priority
  alias somealias
  antrian no_path_retry
  mode 0644
  gid 0
  wwid sometwid
}

Saya mencoba nilai 50, 100, 1000 untuk rr_min_io, tetapi sepertinya tidak ada banyak perbedaan.

Seiring dengan rr_min_io yang bervariasi saya mencoba menambahkan beberapa penundaan antara memulai dd untuk mencegah mereka semua menulis PHY yang sama pada saat yang sama, tetapi ini tidak membuat perbedaan, jadi saya pikir I / O semakin menyebar dengan baik.

Menurut / proc / interupsi, pengendali SAS menggunakan skema interupsi "IR-IO-APIC-fasteoi". Untuk beberapa alasan, hanya inti # 0 di mesin yang menangani gangguan ini. Saya dapat meningkatkan kinerja sedikit dengan menetapkan inti terpisah untuk menangani interupsi untuk setiap pengontrol SAS:

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

Menggunakan dd untuk menulis ke disk menghasilkan "Function call interrupts" (tidak tahu apa ini), yang ditangani oleh core # 4, jadi saya menjaga proses lain dari core ini juga.

Saya menjalankan 48 dd (satu untuk setiap disk), menugaskan mereka ke core yang tidak berurusan dengan interupsi seperti:

tasket -c somecore dd if = / dev / nol = / dev / mapper / mpathx oflag = langsung bs = 128M

oflag = langsung mencegah segala jenis cache buffer terlibat.

Tak satu pun dari inti saya yang tampak maksimal. Core yang berurusan dengan interupsi sebagian besar menganggur dan semua core lainnya menunggu pada I / O seperti yang diharapkan.

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
Cpu1: 0,0% us, 0,8% sy, 0,0% ni, 93,0% id, 0,2% wa, 0,0% hi, 6,0% si, 0,0% st
Cpu2: 0,0% us, 0,6% sy, 0,0% ni, 94,4% id, 0,1% wa, 0,0% hi, 4,8% si, 0,0% st
Cpu3: 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
Cpu5: 0,1% us, 5,5% sy, 0,0% ni, 36,2% id, 58,3% wa, 0,0% hi, 0,0% si, 0,0% st
Cpu6: 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
Cpu8: 0,1% us, 8,3% sy, 0,0% ni, 27,2% id, 64,4% wa, 0,0% hi, 0,0% si, 0,0% st
Cpu9: 0,1% us, 7,9% sy, 0,0% ni, 36,2% id, 55,8% wa, 0,0% hi, 0,0% si, 0,0% st
Cpu10: 0,0% us, 7,8% sy, 0,0% ni, 36,2% id, 56,0% wa, 0,0% hi, 0,0% si, 0,0% st
Cpu11: 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
Cpu15: 0,1% us, 5,4% sy, 0,0% ni, 36,5% id, 58,1% wa, 0,0% hi, 0,0% si, 0,0% st

Mengingat semua ini, throughput yang dilaporkan dengan menjalankan "dstat 10" berada di kisaran 2200-2300 MB / detik.

Mengingat matematika di atas saya akan mengharapkan sesuatu dalam kisaran 2 * 1920 ~ = 3600+ MB / detik.

Adakah yang tahu di mana bandwidth saya yang hilang pergi?

Terima kasih!


sumber
Apakah cache Pengontrol LSI SAS disetel ke Write-Through? (write-back akan lebih lambat untuk beban kerja berurutan yang besar). Mungkin juga ingin menguji dengan bs lebih kecil untuk dd, seperti bs = 1M.
Brian

Jawaban:

1

Bagus, pertanyaan siap :)

Saya sendiri seorang yang cepat dan saya pikir Anda punya uang untuk jujur. Saya setengah berharap untuk melihat throughput Anda lebih rendah dari itu tetapi apa yang saya pikir Anda punya ada penumpukan minor, dan diharapkan, inefisiensi. Misalnya sangat sulit bagi bus PCIe untuk mencapai 100% sepanjang waktu, lebih baik untuk mengasumsikan tingkat keseluruhan 90% rendah. Mengingat jitter ini akan menyebabkan itu juga berarti bahwa PHY tidak akan 100% 'diberi makan' sepanjang waktu sehingga Anda kehilangan sedikit di sana untuk, sama untuk cache, disk, interupsi non-batubara, penjadwalan IO dll. Pada dasarnya itu sedikit ketidakefisienan waktu ketidakefisienan kecil ... dan seterusnya, itu berakhir menjadi lebih dari 5-10% yang diharapkan dari efisiensi sendiri. Saya telah melihat hal semacam ini dengan server HP DL berbicara ke kotak MSA SAS mereka menggunakan W2K3 dan kemudian menjadi NLB ' ed lebih dari beberapa NIC - frustasi tapi bisa dimengerti kurasa. Itu 2c saya, maaf itu tidak terlalu positif.

Chopper3
sumber