利用SATA Raid构建最快的Raspberry Pi NAS

2020-12-07 05:05:40

自从收到预生产的Raspberry Pi计算模块4和IO板的那一天起,我就一直在用Pi测试各种PCI Express卡,并记录所学到的一切。

在完成初步检查后,我测试的第一张卡是IO Crest 4端口SATA卡,照片如下所示,上面是我自己的Pi NAS设置:

但这是一个长期的测试,因为我想了解Raspberry Pi如何处理各种存储情况,包括单个硬盘驱动器以及使用mdadm构建的SSD和RAID阵列。

我还想衡量热性能和能源效率,因为最终目标是构建一个紧凑的基于Raspberry-Pi的NAS,与市场上任何其他廉价NAS竞争。

这篇博客文章的其余部分将详细介绍设置过程中的一些细节,但是我在这篇文章中没有足够的空间来整理我在这里的所有知识,请查看链接的问题和视频!

Raspberry Pi操作系统(实际上,目前为该Pi优化的任何操作系统,例如Ubuntu Server for Pi)都不包含您可能习惯于在典型的Linux发行版中使用的所有标准驱动程序和内核模块。

而且默认情况下不包括SATA内核模块,这意味着使用诸如IO Crest(具有Marvell 9215芯片—内核支持)之类的PCIe卡的第一步是编译(或交叉编译)。我的情况)启用CONFIG_ATA和CONFIG_SATA_AHCI的内核。

我也有在Pi本身上重新编译具有SATA支持的内核的完整说明!

完成此操作后,使用lsblk启动后,您应该能够看到卡上连接的所有驱动器,例如:

$ lsblkNAME MAJ:MIN RM大小RO类型MOUNTPOINTsda 8:0 1 223.6G 0磁盘sdb 8:16 1 223.6G 0 diskmmcblk0 179:0 0 29.8G 0磁盘├─mmcblk0p1179:1 0 256M 0部分/boot└─mmcblk0p2 179:2 0 29.6G 0部分/ nvme0n1 259:0 0 232.9G 0磁盘

(请稍候...那里还有NVMe驱动器吗?!嗯,我还用Pi测试了一些PCI多端口交换机-请遵循该问题以取得进展。)

对于要识别的每个驱动器,如果要在RAID阵列中使用它(我可以这样做),则应添加一个分区。从技术上讲,在创建数组之前不需要分区...但是有两个小原因使它看起来更安全。

因此,对于我的每个设备(从sda到sdd),我运行fdisk来创建一个主分区:

$ sudo fdisk / dev / sdan#创建新分区p#主(默认选项)1#分区1(默认选项)2048#第一个扇区(默认选项)468862127#最后一个扇区(默认选项)w#写入新分区表

您可以通过多种方式对fdisk进行脚本编写,以将给定的布局同时应用于多个驱动器,但是只有四个驱动器,它足够快地进入fdisk,然后按n,然后按Enter键。 39;对于每个默认值,然后用w编写它,然后用q退出。

此时,我们有四个独立的磁盘,每个磁盘都有一个分区,该分区跨越整个卷。使用Linux的多设备管理工具(mdadm),我们可以将这些驱动器组合成任何常见的RAID布置。

我将创建一个供自己使用的RAID 10阵列-您可以查看上面链接的相关视频,这是我选择RAID 10而不是其他原因的原因。

#安装mdadm.sudo apt install -y mdadm#使用四个驱动器创建RAID 10阵列。sudo mdadm --create --verbose / dev / md0 --level = 10 --raid-devices = 4 / dev / sd [ad ] 1#为新的RAID设备创建安装点。sudo mkdir -p / mnt / raid10#格式化RAID设备.sudo mkfs.ext4 / dev / md0#安装RAID设备。sudo mount / dev / md0 / mnt /突袭10

格式化不同的磁盘集时,我遇到了几个不同的问题。例如,当我第一次尝试格式化四个硬盘时,我得到了:

mdadm:super1.x无法打开/ dev / sdd1:设备或资源繁忙mdadm:/ dev / sdd1不适合此阵列.mdadm:创建中止

当我尝试格式化四个SSD时,我还遇到了“设备或资源繁忙”的消息,并且它总是被列为“正在繁忙”的另一台设备。它看起来像是某种竞赛条件,经过一番谷歌搜索后,我发现它确实是这样! mdadm:设备或资源繁忙帖子解决了此问题-创建卷时禁用udev,例如:

您可能还需要在初始化RAID阵列时或在任何给定时间观察RAID阵列的进度和状态,您应该监视两件事: 要确保mdadm在启动时自动配置RAID阵列,请将配置保留在/etc/mdadm/mdadm.conf文件中: #配置mdadm在启动时启动RAID:sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf 并确保在启动时挂载了文件系统,将以下行添加到/ etc / fstab文件的底部: #将以下行添加到/ etc / fstab的底部:/ dev / md0 / mnt / raid1 / ext4默认值,noatime 0 1 在测试期间,我不得不做的另一件事是删除并重新创建数组,这并不难: #卸载阵列。sudo umount / mnt / raid10#停止设备。sudo mdadm --stop / dev / md0#将阵列的所有成员上的超级块置零。sudo mdadm --zero-superblock / dev / sd [ad ] 1#删除设备。sudo mdadm --remove / dev / md0

然后还要确保删除添加到/ etc / fstab或/etc/mdadm/mdadm.conf文件中的所有条目,因为这些条目会在启动期间导致失败!

我要测试的第一件事是,与通过USB 3.0控制器和支持UASP的USB 3.0到SATA的连接相比,通过SATA控制器直接连接的SATA驱动器(在本例中为Kingston SATA 3 SSD)运行速度是否更快外壳。

如您所见,通过SATA直接连接,SSD可以在所有指标上提供明显更好的性能,特别是对于小文件随机IO而言,这在许多使用案例中都很重要。

通过USB 3.0连接的SATA SSD可以轻松使用,但是如果您想在Pi上获得最佳性能,最好使用直接NVMe或SATA SSD存储。

接下来,我想对单个WD Green 500GB硬盘进行基准测试。我之所以购买该型号,是因为它的性能相当平均,但是主要是因为购买其中四个便宜!为了公平起见,由于它甚至无法像金士顿这样的廉价SSD受到欢迎,因此我将其与我最喜欢的Pi的microSD卡(三星EVO +)进行了基准比较:

尽管硬盘确实提供了不错的同步编号(它在PCIe上的可用带宽超过了microSD卡所能提供的带宽),但它却被随机IO上的笨拙的microSD卡所淘汰!

但是将速度较慢的硬盘驱动器放入RAID可以提供更好的性能,因此我接下来在RAID 0和RAID 10中测试了所有四个WD Green驱动器:

而且,正如您所期望的,RAID 0基本上将所有驱动器池化。结合性能指标,以使阵列最终与微型microSD卡竞争4K性能,同时还击败金斯敦SSD以获得同步文件副本。

RAID 10稍微降低了该性能,但是它仍然值得尊重,并且相对于单个驱动器而言有明显的改进。

但我决定全力以赴(至少在不到$ 100的预算之内),再购买三台Kingston SSD,以相同的RAID配置对其进行测试:

令人惊讶的是-因为Raspberry Pi的PCI Express 1x 2.0通道仅提供大约5 Gbps的理论带宽,所以无论添加多少SSD,您都能获得的最大实际吞吐量约为330 MB /秒。

因此,Pi承受的其他IO压力也使得用于SATA SSD的RAID的性能选择要比旋转硬盘驱动器小。在我的一些测试中,我注意到,由于Pi必须将网络流量移至RAID阵列磁盘,因此看起来像是对网络数据包进行排队,而且我猜想Pi的SoC并非内置来泵送无限量的数百MB流量。

说到网络流量,我做的最后一个测试是安装和配置Samba和NFS(请参阅本期的Samba和NFS安装指南),以测试哪个提供了最佳的网络文件副本性能:

看起来NFS成为Pi上的佼佼者,尽管如果您主要使用Windows或Android / iOS,则可能会看到略有不同的结果,或者比Samba难以使用NFS。

我认为Compute Module 4(具有内置的千兆位网络功能以及使用一个或多个PCI Express卡的能力)是我认为不错的第一款Raspberry Pi。 用于运行可靠和高性能的NAS。 就我而言,它已经比我多年来一直用作NAS的旧Mac mini快,后者只有USB 2.0端口,将我的文件在网络上的复制速度限制为每秒35 MB! 但是我绝对希望有人设计一个很好的外壳,其中包含Pi,一块专用的(较小的)IO板,一个PCIe SATA适配器,一个风扇和四个SATA驱动器-理想的设计是紧凑,紧凑! 这是指向我用来构建SATA RAID阵列的所有不同产品的链接(亚马逊会员链接-必须以某种方式支付账单!):