我在 Linux 上使用 ZFS,遇到了一个相当奇怪的症状:当我向系统添加更多磁盘时,每个驱动器的写入速度会降低,从而有效地抵消了额外主轴的顺序写入性能。
磁盘通过 SAS 磁盘架上的 HBA(LSI 9300-8E)连接到主机
在进行以下测试时,我在 IO Zone 上运行了以下命令:iozone -i 0 -s 10000000 -r 1024 -t 10
以下是我的测试结果:
在我的第一次测试中,我创建了一个包含 12 个磁盘的镜像,显示每个磁盘的预期写入性能约为每秒 100 MB/s。
zpool create -o ashift=12 -f PoolA 镜像 S1_D0 S2_D0 镜像 S1_D1 S2_D1 镜像 S1_D2 S2_D2 镜像 S1_D3 S2_D3 镜像 S1_D4 S2_D4 镜像 S1_D5 S2_D5 容量操作带宽 池分配空闲读写读写 ---------- ----- ----- ----- ----- ----- ----- 池A 3.60G 10.9T 0 5.06K 0 638M 镜像 612M 1.81T 0 863 0 106M S1_D0 - - 0 862 0 106M S2_D0 - - 0 943 0 116M 镜像 617M 1.81T 0 865 0 107M S1_D1 - - 0 865 0 107M S2_D1 - - 0 939 0 116M 镜像 613M 1.81T 0 860 0 106M S1_D2 - - 0 860 0 106M S2_D2 - - 0 948 0 117M 镜像 611M 1.81T 0 868 0 107M S1_D3 - - 0 868 0 107M S2_D3 - - 0 1.02K 0 129M 镜像 617M 1.81T 0 868 0 107M S1_D4 - - 0 868 0 107M S2_D4 - - 0 939 0 116M 镜像 616M 1.81T 0 856 0 106M S1_D5 - - 0 856 0 106M S2_D5 - - 0 939 0 116M ---------- ----- ----- ----- ----- ----- -----
在下一个测试中,我添加了 12 个磁盘,总共 24 个磁盘,并且我们有效地将每个磁盘的带宽减少了一半。
zpool create -o ashift=12 -f PoolA 镜像 S1_D0 S2_D0 镜像 S1_D1 S2_D1 镜像 S1_D2 S2_D2 镜像 S1_D3 S2_D3 镜像 S1_D4 S2_D4 镜像 S1_D5 S2_D5 镜像 S1_D6 S2_D6 镜像 S1_D7 S2_D7 镜像 S1_D8 S2_D8 镜像 S1_D9 S2_D9 镜像 S1_D10 S2_D10 镜像 S1_D11 S2_D11 容量操作带宽 池分配空闲读写读写 ----------- ----- ----- ----- ----- ----- ----- 池A 65.2M 21.7T 0 4.67K 0 588M 镜像 6.56M 1.81T 0 399 0 49.0M S1_D0 - - 0 399 0 49.0M S2_D0 - - 0 513 0 63.1M 镜像 5.71M 1.81T 0 400 0 48.7M S1_D1 - - 0 400 0 48.7M S2_D1 - - 0 515 0 62.6M 镜子 6.03M 1.81T 0 396 0 49.1M S1_D2 - - 0 396 0 49.1M S2_D2 - - 0 509 0 62.9M 镜像 5.89M 1.81T 0 394 0 49.0M S1_D3 - - 0 394 0 49.0M S2_D3 - - 0 412 0 51.3M 镜像 5.60M 1.81T 0 400 0 49.0M S1_D4 - - 0 400 0 49.0M S2_D4 - - 0 511 0 62.9M 镜像 4.65M 1.81T 0 401 0 48.9M S1_D5 - - 0 401 0 48.9M S2_D5 - - 0 511 0 62.3M 镜像 5.36M 1.81T 0 397 0 49.2M S1_D6 - - 0 397 0 49.2M S2_D6 - - 0 506 0 62.5M 镜像 4.88M 1.81T 0 395 0 49.2M S1_D7 - - 0 395 0 49.2M S2_D7 - - 0 509 0 63.3M 镜像 5.01M 1.81T 0 393 0 48.2M S1_D8 - - 0 393 0 48.2M S2_D8 - - 0 513 0 63.0M 镜像 5.00M 1.81T 0 399 0 48.7M S1_D9 - - 0 399 0 48.7M S2_D9 - - 0 513 0 62.5M 镜像 5.00M 1.81T 0 398 0 49.2M S1_D10 - - 0 398 0 49.2M S2_D10 - - 0 509 0 62.8M 镜像 5.55M 1.81T 0 401 0 50.0M S1_D11 - - 0 401 0 50.0M S2_D11 - - 0 506 0 63.1M ----------- ----- ----- ----- ----- ----- -----
希望有人可以解释为什么添加更多磁盘会有效降低每个磁盘的性能。
额外要求的信息
硬件概要
服务器
联想 ThinkServer RD550,单个 10 核 Xeon,256GB 内存,720ix 控制器上的 RAID 1 操作系统。
服务器 HBA
LSI 9300-8e mpt3sas_cm0:LSISAS3008:FWVersion(12.00.00.00)、ChipRevision(0x02)、BiosVersion(06.00.00.00)
磁盘架
磁盘架是联想 ThinkServer SA120,配备双 SAS 控制器、双电源,以冗余方式连接,每个磁盘有 2 条路径。
磁盘架连接
磁盘架通过 0.5 米 SAS 电缆连接,并通过菊花链形式穿过磁盘架,最后返回到控制器。
驱动器信息
48 x 2TB SAS 硬盘 Seagate 型号 # ST2000NM0023 硬盘通过多路径配置,每个硬盘都有冗余路径。
软件概要
操作系统/内核
CentOS 7.3 “uname -a”的输出 Linux 4.9.9-1.el7.elrepo.x86_64 #1 SMP 星期四 2 月 9 日 11:43:40 EST 2017 x86_64 x86_64 x86_64 GNU/Linux
ZFS 调优
/etc/modprobe.d/zfs.conf 目前是一个空白文件,我在这里没有进行太多尝试,顺序写入性能似乎应该随着磁盘数量的增加而提高。
答案1
LSI 9300-8e HBA 的规格规定连接存储的吞吐量为 12Gb(千兆位)。(https://docs.broadcom.com/docs/12353459)将该数字乘以带宽,可获得~9600MB/秒的总吞吐量。
操作系统中是否有限制 I/O 的 HBA(驱动程序)的总体 I/O 队列深度设置?这仍然无法解释带宽如何如此准确地减半。
如果只有一条“单路径”或一条链路用于 SAS 连接,您的数字将非常有意义 - 是否有任何(奇怪的)方式导致八个链路中只有一个链路可以工作?我不知道从“物理”配置的 SAS“端口”(虚拟对象而非物理对象)有多宽或多窄,如果 HBA 未与您的磁盘架通信,是否有可能允许这种情况的后备配置选项?
答案2
等待更多信息...
您应该提供如下详细信息:
- 磁盘的具体品牌、型号、速度、接口。(它们是 SAS 还是 SATA?)
- 正在使用的特定外部 JBOD 附件。
- 机箱如何连接到服务器。
谁知道呢?您可能只是在机箱的 SAS 扩展器上超额认购,并且无法通过添加驱动器主轴进行扩展。
当然,这里也有一个调整的元素。我们需要看看你对 做了哪些修改/etc/modprobe.d/zfs.conf
。
如果该文件为空,您可能会错过大量可用于 ZFS 构建的可调参数。
你能解释一下正在使用的是什么操作系统吗?发行版、内核和版本。
只需关注我的Linux+ZFS HA 指南。
您还需要调整 zfs.conf:
这是我的:
#options zfs zfs_arc_max=51540000000
options zfs zfs_vdev_scrub_min_active=24
options zfs zfs_vdev_scrub_max_active=64
options zfs zfs_vdev_sync_write_min_active=8
options zfs zfs_vdev_sync_write_max_active=32
options zfs zfs_vdev_sync_read_min_active=8
options zfs zfs_vdev_sync_read_max_active=32
options zfs zfs_vdev_async_read_min_active=8
options zfs zfs_vdev_async_read_max_active=32
options zfs zfs_top_maxinflight=320
options zfs zfs_txg_timeout=15
options zfs zfs_vdev_scheduler=deadline
options zfs zfs_prefetch_disable=0
options zfs l2arc_write_max=8388608
options zfs l2arc_headroom=12
options zfs zfs_dirty_data_max_percent=40
options zfs zfs_vdev_async_write_min_active=8
options zfs zfs_vdev_async_write_max_active=32
options zfs zfs_immediate_write_sz=131072
options zfs zil_slog_limit=536870912