在 Linux 上提高 SAS 多路径到 JBOD 的性能

10 linux storage sas sun multipath

我正在尝试使用 Linux 优化某些 Sun 硬件上的存储设置。任何想法将不胜感激。

我们有以下硬件:

  • 太阳之刃 X6270
  • 2* LSISAS1068E SAS 控制器
  • 2 个带有 1 TB 磁盘的 Sun J4400 JBOD(每个 JBOD 24 个磁盘)
  • Fedora 核心 12
  • 来自 FC13 的 2.6.33 发布内核(也尝试使用来自 FC12 的最新 2.6.31 内核,结果相同)

这是 SAS 硬件的数据表:

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

它使用 PCI Express 1.0a,8x 通道。每条通道的带宽为 250 MB/秒,我们应该能够达到每个 SAS 控制器 2000 MB/秒的速度。

每个控制器每个端口可以达到 3 Gb/秒,并且有两个 4 端口 PHY。我们将两个 PHY 从控制器连接到 JBOD。因此,在 JBOD 和控制器之间,我们有 2 个 PHY * 4 个 SAS 端口 * 3 Gb/秒 = 24 Gb/秒的带宽,这超过了 PCI Express 带宽。

启用写缓存并进行大写时,每个磁盘可以维持大约 80 MB/秒(接近磁盘的开头)。使用 24 个磁盘,这意味着每个 JBOD 应该能够达到 1920 MB/秒。

多径{
  rr_min_io 100
  用户名 0
  path_grouping_policy 多总线
  故障恢复手册
  path_selector "循环 0"
  rr_weight 优先级
  别名 别名
  no_path_retry 队列
  模式 0644
  编号 0
  wwid 一些wwid
}

我为 rr_min_io 尝试了 50、100、1000 的值,但似乎没有太大区别。

随着 rr_min_io 的变化,我尝试在启动 dd 之间添加一些延迟,以防止它们同时写入同一个 PHY,但这没有任何区别,所以我认为 I/O 得到了适当的分布。

根据 /proc/interrupts,SAS 控制器正在使用“IR-IO-APIC-fasteoi”中断方案。出于某种原因,只有机器中的核心 #0 处理这些中断。我可以通过分配一个单独的内核来处理每个 SAS 控制器的中断来稍微提高性能:

回声 2 > /proc/irq/24/smp_affinity
回声 4 > /proc/irq/26/smp_affinity

使用 dd 写入磁盘会生成“函数调用中断”(不知道这些是什么),由核心 #4 处理,因此我也将其他进程与该核心分开。

我运行 48 个 dd(每个磁盘一个),将它们分配给不处理中断的内核,如下所示:

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

oflag=direct 防止任何类型的缓冲区缓存参与进来。

我的核心似乎都没有用完。处理中断的内核大多处于空闲状态,所有其他内核都在等待 I/O,正如人们所期望的那样。

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

鉴于所有这些,运行“dstat 10”报告的吞吐量在 2200-2300 MB/秒的范围内。

鉴于上面的数学计算,我希望在 2*1920 ~= 3600+ MB/sec 范围内得到一些东西。

有人知道我丢失的带宽去了哪里吗?

谢谢!

Cho*_*er3 1

很好,准备充分的问题:)

我自己就是一个注重速度和饲料的人,说实话,我认为你是有钱的。我有一半期望看到你的吞吐量低于实际水平,但我认为你所得到的是轻微的、预期的低效率的积累。例如,PCIe 总线很难始终达到 100%,最好假设总体速率较低,为 90%。考虑到抖动,这将导致 PHY 不会一直 100%“馈送”,因此您会损失一点,缓存、磁盘、非合并中断、IO 调度等也是如此。基本上轻微的低效率乘以轻微的低效率时间……依此类推,最终会超过 5-10% 的预期低效率。我见过这样的事情:HP DL 服务器使用 W2K3 与 MSA SAS 盒进行通信,然后通过多个 NIC 进行 NLB - 令人沮丧,但我想这是可以理解的。无论如何,这就是我的 2c,抱歉,它不太积极。