组装一台廉价的(伪)企业级 NAS

基于 ASRock Rack X470D4U,Ryzen 5 3600 与 FreeNAS 的新玩具介绍。AMD Yes!

写上一篇文章的时候我仍然在使用 QNAP TS-932X NAS,不过其实对 QNAP 的不满一直在增加,主要体现在以下几个方面

  1. 硬件性能差
    虽然是一个双万兆网口的 NAS,但是实际上 TS-932X 每个万兆网口只有发送能达到接近 10 Gbps 的速率,接收仅能达到 5-6 Gbps,并且 CPU 达到单核心100%的占用。除此之外,RAID5 性能也只能达到 400-500 MB/s,这导致我的 SMB 写入速率受到很大的限制,3个 SATA SSD 组成 RAID5 阵列大约仅有 400 MB/s 的实际写入速率。作为一个标榜万兆的 NAS,这个性能显然是不合格的。
    除此之外,QNAP 的 SSD cache 基于已经停止维护的 Facebook flashcache ,并且存在严重的性能问题。官方论坛自 2017 年起就有大量客户反映这个问题,QNAP 多年以来却没有给出合理的解决方案。
    这些问题导致这个 NAS 在实际使用过程中表现严重低于预期,万兆网可以说基本就是个摆设,日常使用实际也就 2.5 Gbps 到 5 Gbps 左右的吞吐。
  2. 软件质量差,核心组件版本老,稳定性差
    我不太了解 QNAP 内部的软件开发流程,但是从一些软件的小细节得知 QNAP 的软件开发人员对 Linux 以及 shell script 的理解仍然停留在非常初级的阶段,例如系统中出现一些名称为 ‘/dev/NULL’ 和 ‘/dev/null 2>&1’ 的文件,里面写了不知道哪个进程的 PID;或者当管理员修改设置,系统需要重新载入 Samba 配置时,它会暴力地杀死系统中所有名为 ‘smbd’ 的进程,无论这个进程是 QNAP 自己启动的,还是存在于 docker 或者 lxc 中。我曾经使用 lxc 部署第二个 samba 实例供一些内网特殊服务访问一部分目录,却发现 smbd 经常被杀死,诊断了很久才发现这个问题。
    另外,截至目前,QNAP NAS 仍在大量使用已停止维护的旧版本开源软件,例如 Linux 4.2.8,Samba 4.7 等。使用过时的软件会带来很多问题,例如缺少安全性更新,缺少 bugfix 等。
    事实上,在一年多的实际使用过程中,我已经遇到过不止一次 SMB 拷贝文件发生损坏的问题。开机运行一段时间后,经常能看到 kernel message 中出现各种各样的 kernel stack backtrace,在 log 里也经常看到 samba 组件崩溃。这些问题在生产环境都不是什么好现象,但是 QNAP 把这些打包起来做成产品卖给一无所知的用户。对用户而言,这样的一个产品是完全的黑盒子,感到不满也没有办法去自行替换这些软件。
  3. 存储池管理操作存在严重问题,没有阻止无效的操作
    2018年底,当我创建第一个 static volume 时,我使用了3个 WD 6 TB 红盘组成 RAID5 阵列,并将文件系统的 bytes per inode 设置为 4K,意味着我将来最多可以将这个 volume 扩展到 16 TB。
    后来我的存储需求逐渐增长,于是购买了另外两个 6 TB 的硬盘,准备将其扩展到5个 6 TB 硬盘组成的 RAID6 阵列,这样我可以使用 18 TB 的存储空间。不幸的是 18 TB 超过了 16 TB的限制。但是一年过去了,我早已忘记这件事情。
    而 QNAP 在我试图将3个 6 TB 硬盘组成的 RAID5 阵列的 static volume 扩展到5个 6 TB 硬盘组成 RAID6 阵列的操作时,并没有提醒我这件事,也没有拒绝我的请求,而是直接开始了扩展操作。其结果可想而知,三天两夜的 RAID 扩展操作,在最后 resize 文件系统的一步失败,文件系统仍然是 10 TB 左右的可用空间,并没有增加到 18 TB,或者最大限制的 16 TB。
    更糟糕的是,QNAP 对于操作失败的描述里并没有包含任何有意义的信息,我不得不连接 SSH 尝试使用 resize2fs 等工具完成最后一步,最后这样才得知失败原因是最初的 bytes per inode 选择的太小。这件事让我不得不找地方备份将近 8 TB 的内容,然后重建整个存储池,再慢慢恢复数据。

上面这些问题是我对 QNAP 失望的主要原因,除此之外还有类似前一篇文章提到的与 Linux 有关的一些小问题。虽然听说 Synology 的软件质量比 QNAP 要好很多,但是考虑到 Synology 也在用已经停止维护的 Facebook flashcache,甚至还有 btrfs 这个连 RedHat 都玩不起的受诅咒的文件系统,再加上高昂的价格以及一些同样的问题(不能自由选择、定制系统软件等等),我决定尝试自己组装一台没有上述问题的 NAS。

你行你上

——热心群众

方案的选择与可行性评估

研究一套替代 QNAP TS-932X 的方案,需要满足以下需求

  1. 机箱需要支持硬盘热插拔,不少于5个 HDD 盘位和4个 SSD 盘位。
  2. 平台需要有足够多的 PCIe 插槽用于连接 HBA 与万兆网卡。
  3. 为了达到企业级的可靠性和稳定性,ECC 内存是必不可少的。
  4. 操作系统需要满足高性能、高质量、简单易用几个条件,并且需要具备 Active Directory 集成,存储池管理,以及 SMB、NFS、iSCSI 等基本功能。

最终,硬件方面我选择了以下配置

配置表

  • 机箱:银欣 CS381
  • 主板:X470D4U
  • 内存:2×Micron DDR4 32 GB 3200MT UDIMM ECC
  • HBA:LSI 9300-8i,使用两条 SFF-8643 Mini-SAS 线连接到机箱背板
  • 网卡:Intel X710-DA2 双光口万兆网卡
  • CPU:AMD Ryzen 5 3600
  • 电源:银欣 ST45SF-G
  • 系统盘:两个 WD SN550 250GB mirror

机箱选择了银欣的 CS381,这个机箱有8个支持 SAS3/SATA3 的热插拔硬盘位并且自带背板,内部可以安装4个2.5英寸硬盘,相对 QNAP TS-932X 而言可以算是一个小小的升级。选择这个机箱的主要理由是支持 microATX 主板,这显著提升了硬件兼容性、扩展性和升级空间。代价是体积较大,不过 NAS 也不会整天搬来搬去所以这是个无关紧要的问题。

CPU 选择 3600 主要是考虑到 Samba 等软件在 10 GbE 以上的环境中,对 CPU 单线程性能的要求较高。当启用了 SMB3 加密时,Samba 对 CPU 的单线程使用更是尤为明显。因此选择了单线程性能较为优秀的主流 CPU。事实上这颗6核心处理器对于 NAS 这个需求而言完全是性能过剩,只是 Zen2 架构在我评估可行性的阶段没有更低端的处理器了。目前看来,大概还是 Ryzen 3 3100 和 3300X 更适合这个工作。退一步讲,NAS 软件对单核心性能要求也不是非 Zen2 不可,可以选择 Ryzen 5 2600 甚至低至 Ryzen 3 1200 的处理器,但是考虑到这套方案里 CPU 的价格占比并不高,一味地缩减这一项并不划算,又考虑到 3100 和 3300X 还要再等一个月才能买到,最终还是直接购买了 3600。

备选方案里还有 Intel Xeon-E 搭配服务器芯片组,也能实现类似的方案。但是 Intel 平台与 AM4 平台相比少了4条直连 CPU 的 PCIe 通道,Intel 芯片组的 SATA 性能也不如 ASMedia 做的 X470/B450 强,主板还卖的更贵。例如同样是 ASRock Rack 的 E3C246D4U 与 E3C242D4U,与 X470D4U 相比,综合来看并不是一个非常好的选择。

主板选择了 X470D4U,这是目前大陆能买到的 AMD Ryzen 平台唯一一个带有 BMC/IPMI 的主板。这个主板在 reddit 和一些海外论坛上风评并不是特别好,不过看起来也没有什么不能接受的大问题。

操作系统方面,一直听说 FreeNAS 好用,于是这次搭建新机器选择了安装 FreeNAS 进行尝试。虽然印象中 FreeBSD 对 AMD 平台的支持仍然不是那么的完善,但是经过对一些论坛帖子的研究,我认为目前 FreeNAS 在 AMD 平台已经处于一个可以稳定使用状态。

除了 FreeNAS,我还研究过 OpenMediaVault 与 Windows Server 两套方案。遗憾的是,OpenMediaVault 并没有非常直观的 Active Directory 集成,加入 AD 需要在命令行里自行修改 Samba 配置。而 Windows Server 对 NFS 支持不佳,且网络性能差强人意。虽然支持 SMB Direct,但是目前我的其它设备均不支持 RDMA,所以也不能解决问题。

网卡、HBA 基本上都是选的入门级的企业级硬件,再往下缩就是洋垃圾了。而来路不明的硬件或者二手货都是本次计划中需要极力避免的,毕竟不像软路由或者游戏主机,涉及到数据存储的硬件是不敢乱玩的,否则回头因为各种原因丢了数据都不知道该找谁抱怨。

从4月初我开始计划组装这台机器,由于种种原因,到了5月的假期才完成组装。其中用了大约两周的时间进行方案筛选与可行性评估,又由于主板缺货,用了半个月时间等待主板到货,可以说是非常艰难的一个过程了。

好在安装过程十分顺利,不仅一次点亮,还顺利通过了五一假期连续5天的高强度 I/O 测试,并且完成了数据迁移,期间网络 I/O 总量达到了将近 40 TB,没有产生任何的崩溃或错误。

经过5天的测试,以下是我对这一套方案的优缺点的一些总结。

优点

  • 自带 SAS3/SATA 背板,8个主硬盘位支持热插拔
  • 高性能
    将测试的 data size 设置为 1 GB,使得测试可以在 RAM cache 内完成,这样可以尽可能展示 SMB 的性能,而非硬盘的性能。
    Samba 4.10 顺序读写吞吐可达1.2GB/s,达到了万兆网的线速,并且 CPU 的占用在单核 30% 以下。
    4k Q32T16 读写可达 100k IOPS,此时 CPU 成为瓶颈,Samba 进程占用约 80% 单核。这个成绩大约是 QNAP TS-932X 的6-7倍。
    4k Q1T1 延迟仅约 130 μs。
  • 可自由灵活配置软件
    支持基于 Windows Server、Linux、FreeBSD 的方案
  • microATX 主板扩展能力强,具备网络、存储两方面的升级路线
    最高支持 128 GB 内存,第二个 PCIe x8 插槽可用于安装 40G 网卡、第二个 HBA,或带 PLX 的 M.2 SSD 转接板
  • AM4 平台的生命周期长,支持的处理器性能、价格范围广并且会降价,在计算方面有广泛的选择空间和较好的升级路线
  • 主板自带 BMC,支持 IPMI 远程管理和板载 VGA 图形输出
  • 支持 ECC,适合 24×7 运行

缺点

  • 入门价格较高
    机箱与主板加起来将近4000元,已经超过了一些入门级万兆 NAS 的价格。HBA、万兆网卡、32 GB ECC 内存、6核心 CPU 的价格也都在1000元以上。
  • 两个 250 GB 的 NVMe 系统盘 mirror 是非常多余的,不仅浪费钱,还浪费了两个宝贵的 M.2 插槽。事实上系统仅占用 1 GB 的空间,没有高性能读写需求,系统盘多余的空间也无法用作其它用途例如 L2ARC 缓存、SLOG 等,因此使用两个 8 GB U 盘做 mirror 启动足够。
  • 主板产量不够高,经常缺货,订货周期较长
  • 缺乏类似群晖、QNAP 开箱即用的应用生态
    但是其实我并不需要这些花哨的功能,所以无关痛痒。
  • 虽然 X470D4U 主板具备很多企业级特性,Ryzen 仍然是一个消费级平台,缺乏正式的企业级支持。
  • FreeNAS/FreeBSD 目前暂不支持 Ryzen 3000 系列的 ECC/EDAC
    如果内存发生 2-bit 翻转,OS 无法进行相应处理
    可暂时使用基于 Linux 的方案,例如 OpenMediaVault
  • 图形界面并不能直观地表明硬盘所在位置,必须通过硬盘设备名推断,更换硬盘尤其是热插拔可能会比群晖、QNAP 的 NAS 方案麻烦
  • SMB 加密性能低
    FreeNAS 11.3 目前使用 Samba 4.10 版本,开启 SMB3 加密后,大约只能达到 400 MB/s 的吞吐率,且 CPU 占用率高达单核 80%。Samba 在后续版本中改进了加密性能,据称吞吐率提升了4到6倍。因此解决这个问题需要等待 FreeNAS 更新 Samba 版本,或使用 Windows Server/Linux 方案替代。
  • Samba 不支持基于 RDMA 的 SMB Direct,并且多年来对 SMB Multichannel 的支持仅停留在实验性的阶段
    可使用 Windows Server 替代
  • Samba 不支持 SMB 2.1 resilient handle,默认配置无法用于存储 Hyper-V VHD
    可将最高 SMB 版本设置为 SMB2_02,或安装 Windows Server 作为 NAS 系统,替代 Samba
  • Samba 不支持多机 transparent failover
    可使用 Windows Server 替代
  • 主板不支持拆卸散热器背板,再加上散热器限高仅不到6cm,散热器选择非常有限
    好在 Ryzen 3600 的功耗不高,原装散热器默频足够。在 BIOS 中将温度墙手动设置为 67℃,以防止 CPU 过热。
  • 散热器与内存的方向与普通主板不同,且散热器非常容易挡内存
    Ryzen 3600 原装散热器紧贴内存,如果要插满4条内存,安装和更换非常麻烦。
  • 机箱风扇吵,并且默认配置为负压,容易聚集灰尘
    可以自行更换风扇,调整风扇方向,或安装防尘网等
  • 拆装 SSD 涉及到太多螺丝,不利于运行时热更换
    万一不慎掉了一颗螺丝到主板上就麻烦大了。因此 SSD 只能 offline 安装、拆除。

总结

总体来说,这次组装 NAS 的计划算是成功地完成了。

虽然写了这么多缺点和吐槽,不过我认为这些都是可以接受的小问题,并且其中一些问题如果真的是要解决,也不是没有办法,毕竟自己组装的 NAS 可以随意选择操作系统,总有能满足自己需求的软件方案。

比起被商业公司死死地绑定在自己做的垃圾系统和生态上,我更喜欢这种选择权在手的自由感。虽然花了很多时间研究各种各样的方案,但是我仍然认为这是非常值得的一件事情,也确确实实是提升了自己的使用体验。

组装一台廉价的(伪)企业级 NAS》有13个想法

    1. David Huang 文章作者

      我没有尝试过ESXi,不过据了解目前这个板子最新的BIOS是AGESA 1.0.0.3ABBA,而Ryzen 3000的IOMMU到1.0.0.4B才算真正可用,大概还是要等新版BIOS出来才能正常使用SR-IOV。

      可以去reddit上问一下。

      回复
  1. Chitose Ikeda

    跟永擎的PM沟通了一下,BIOS后续会直接上AGESA 1.0.0.6因为有…U[doge]
    然后7月有X570…D4U…[doge]
    年底还有…

    回复
  2. 大萝卜

    请教楼主smb.conf和zfs配置,我同样ubuntu+zfs+samba,万兆网络,8个盘组的raidz2,iperf3测速跑满;但是和win10向nas写入数据时最高才600MB/s,读取时800Mb/S ,总感觉哪里出了瓶颈。

    回复

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注