Cải thiện đa luồng SAS thành hiệu suất JBOD trên Linux


10

Tôi đang cố gắng tối ưu hóa thiết lập lưu trữ trên một số phần cứng của Sun với Linux. Bất kỳ suy nghĩ sẽ được đánh giá rất cao.

Chúng tôi có các phần cứng sau:

  • Phiến mặt trời X6270
  • Bộ điều khiển 2 * LSISAS1068E
  • 2 * Sun J4400 JBOD với 1 đĩa TB (24 đĩa cho mỗi JBOD)
  • Lõi Fedora 12
  • 2.6.33 phát hành kernel từ FC13 (cũng đã thử với kernel 2.6.31 mới nhất từ ​​FC12, kết quả tương tự)

Đây là biểu dữ liệu cho phần cứng SAS:

http://www.sun.com/st Storage / st Storage_networking / hba / sas / PCIe.pdf

Đó là sử dụng PCI Express 1.0a, 8 làn. Với băng thông 250 MB / giây trên mỗi làn, chúng ta sẽ có thể thực hiện 2000 MB / giây trên mỗi bộ điều khiển SAS.

Mỗi bộ điều khiển có thể thực hiện 3 Gb / giây trên mỗi cổng và có hai PHY 4 cổng. Chúng tôi kết nối cả PHY từ bộ điều khiển với JBOD. Vì vậy, giữa JBOD và bộ điều khiển, chúng ta có 2 PHY * 4 cổng SAS * 3 Gb / giây = 24 Gb / giây băng thông, nhiều hơn băng thông PCI Express.

Với bộ nhớ đệm ghi được kích hoạt và khi thực hiện ghi lớn, mỗi đĩa có thể duy trì khoảng 80 MB / giây (gần khi bắt đầu đĩa). Với 24 đĩa, điều đó có nghĩa là chúng tôi sẽ có thể thực hiện 1920 MB / giây mỗi JBOD.

đa đường {
  rr_min_io 100
  uid 0
  path_grouping_policy multibus
  hướng dẫn dự phòng
  path_selector "vòng tròn 0"
  ưu tiên rr_ weight
  bí danh somealias
  hàng đợi no_path_retry
  chế độ 0644
  gid 0
  một cách nào đó
}

Tôi đã thử các giá trị 50, 100, 1000 cho rr_min_io, nhưng dường như nó không tạo ra nhiều khác biệt.

Cùng với rr_min_io khác nhau, tôi đã cố gắng thêm một số độ trễ giữa việc bắt đầu dd để ngăn tất cả chúng viết trên cùng một PHY cùng một lúc, nhưng điều này không tạo ra bất kỳ sự khác biệt nào, vì vậy tôi nghĩ rằng I / O đang được trải đều.

Theo / Proc / ngắt, bộ điều khiển SAS đang sử dụng sơ đồ ngắt "IR-IO-APIC-fasteoi". Vì một số lý do, chỉ có lõi số 0 trong máy đang xử lý các ngắt này. Tôi có thể cải thiện hiệu suất một chút bằng cách chỉ định một lõi riêng để xử lý các ngắt cho mỗi bộ điều khiển SAS:

tiếng vang 2> / Proc / irq / 24 / smp_affinity
tiếng vang 4> / Proc / irq / 26 / smp_affinity

Việc sử dụng dd để ghi vào đĩa sẽ tạo ra "Các ngắt cuộc gọi chức năng" (không biết đây là những gì), được xử lý bởi lõi số 4, vì vậy tôi cũng giữ các quy trình khác khỏi lõi này.

Tôi chạy 48 dd (một cho mỗi đĩa), gán chúng cho các lõi không xử lý các ngắt như vậy:

tasket -c somecore dd if = / dev / zero of = / dev / mapper / mpathx oflag = direct bs = 128M

oflag = direct ngăn bất kỳ loại bộ đệm bộ đệm nào tham gia.

Không có lõi của tôi dường như tối đa. Các lõi xử lý các ngắt hầu hết là không hoạt động và tất cả các lõi khác đang chờ trên I / O như người ta mong đợi.

Cpu0: 0,0% chúng tôi, 1,0% sy, 0,0% ni, 91,2% id, 7,5% wa, 0,0% hi, 0,2% si, 0,0% st
Cpu1: 0,0% chúng tôi, 0,8% sy, 0,0% ni, 93,0% id, 0,2% wa, 0,0% hi, 6,0% si, 0,0% st
Cpu2: 0,0% chúng tôi, 0,6% sy, 0,0% ni, 94,4% id, 0,1% wa, 0,0% hi, 4,8% si, 0,0% st
Cpu3: 0,0% chúng tôi, 7,5% sy, 0,0% ni, 36,3% id, 56,1% wa, 0,0% hi, 0,0% si, 0,0% st
Cpu4: 0,0% chúng tôi, 1,3% sy, 0,0% ni, 85,7% id, 4,9% wa, 0,0% hi, 8,1% si, 0,0% st
Cpu5: 0,1% chúng tôi, 5,5% sy, 0,0% ni, 36,2% id, 58,3% wa, 0,0% hi, 0,0% si, 0,0% st
Cpu6: 0,0% chúng tôi, 5,0% sy, 0,0% ni, 36,3% id, 58,7% wa, 0,0% hi, 0,0% si, 0,0% st
Cpu7: 0,0% chúng tôi, 5,1% sy, 0,0% ni, 36,3% id, 58,5% wa, 0,0% hi, 0,0% si, 0,0% st
Cpu8: 0,1% chúng tôi, 8,3% sy, 0,0% ni, 27,2% id, 64,4% wa, 0,0% hi, 0,0% si, 0,0% st
Cpu9: 0,1% chúng tôi, 7,9% sy, 0,0% ni, 36,2% id, 55,8% wa, 0,0% hi, 0,0% si, 0,0% st
Cpu10: 0,0% chúng tôi, 7,8% sy, 0,0% ni, 36,2% id, 56,0% wa, 0,0% hi, 0,0% si, 0,0% st
Cpu11: 0,0% chúng tôi, 7,3% sy, 0,0% ni, 36,3% id, 56,4% wa, 0,0% hi, 0,0% si, 0,0% st
Cpu12: 0,0% chúng tôi, 5,6% sy, 0,0% ni, 33,1% id, 61,2% wa, 0,0% hi, 0,0% si, 0,0% st
Cpu13: 0,1% chúng tôi, 5,3% sy, 0,0% ni, 36,1% id, 58,5% wa, 0,0% hi, 0,0% si, 0,0% st
Cpu14: 0,0% chúng tôi, 4,9% sy, 0,0% ni, 36,4% id, 58,7% wa, 0,0% hi, 0,0% si, 0,0% st
Cpu15: 0,1% chúng tôi, 5,4% sy, 0,0% ni, 36,5% id, 58,1% wa, 0,0% hi, 0,0% si, 0,0% st

Với tất cả điều này, thông lượng được báo cáo bằng cách chạy "dstat 10" nằm trong khoảng 2200-2300 MB / giây.

Với phép toán ở trên, tôi sẽ mong đợi một cái gì đó trong phạm vi 2 * 1920 ~ = 3600+ MB / giây.

Có ai có ý tưởng về việc băng thông bị thiếu của tôi đã đi đâu không?

Cảm ơn!


Bộ nhớ cache của Bộ điều khiển LSI SAS có được đặt thành Ghi không? (ghi lại sẽ chậm hơn cho khối lượng công việc tuần tự lớn). Cũng có thể muốn kiểm tra với bs nhỏ hơn cho dd, như bs = 1M.
Brian

Câu trả lời:


1

Đẹp, câu hỏi chuẩn bị tốt :)

Bản thân tôi là một người đàn ông tốc độ và tôi nghĩ rằng bạn đang có tiền để thành thật. Tôi đã mong đợi một nửa để thấy thông lượng của bạn thấp hơn nó nhưng những gì tôi nghĩ rằng bạn đã có một sự tích lũy nhỏ và không hiệu quả. Ví dụ, rất khó để một chiếc xe buýt PCIe có thể đạt tới 100% mọi lúc, tốt hơn là giả sử tỷ lệ chung thấp 90%. Với jitter, điều này sẽ gây ra điều đó cũng có nghĩa là PHY sẽ không được 'cho ăn' 100% mọi lúc nên bạn mất một chút ở đó, tương tự cho bộ đệm, đĩa, ngắt không liên kết, lập lịch IO, v.v. nó không hiệu quả gấp nhiều lần thời gian không hiệu quả nhỏ ... và cứ như vậy, cuối cùng nó lại vượt quá 5-10% hiệu quả dự kiến ​​của chính họ. Tôi đã thấy điều này với các máy chủ HP DL nói chuyện với các hộp MSA SAS của họ bằng W2K3 và sau đó là NLB ' ed trên nhiều NIC - tôi đoán bực bội nhưng có thể hiểu được. Dù sao đó cũng là 2c của tôi, xin lỗi vì nó không quá tích cực.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.