自上次讨论以来,结合最近一段时间的探索、配置和尝试,获得了一些阶段性的成果和结论,在此与大家分享。
首先,非常感谢 @
iBugOne 提供的富有深度的见解,感谢铜币已经送上。如果大家觉得某个帖子的内容对你有所帮助,在收藏之余也还请同样点个感谢或者稍作回复 [对,也是来骗铜币的] 。
**目前的方案**
1. 4 个 HDD 单独组成了一个 RAID-Z2 ZFS 存储池,服务于备份、非性能敏感的长期温-冷数据存储。
2. 2xSSD+2xHDD 各自 RAID1 后,以 SSD 为 cache 组成了 LVM 。通过一些参数配置,使得尽可能更多的随机读写全部由 SSD 承接。
3. 在应用上,搭建了两套应用软件,包括一些数据库、少量的虚拟机磁盘、数据处理平台和其他性能相对敏感的应用被放在了 LVM 中,而 ZFS 作为数据仓库和备份的同时也承担了一些非性能敏感的大容量存储挂载。另外还有一系列的脚本和 cron 实现了包括监控、快照、备份等自动化维护。
**目前的方案带来的一些效果**
经过了一些简单的测试和近段时间的使用体验来看,基本达到了如下效果:
LVM 上:
1. 对于跑模型训练时的数据集这样的典型需求,大部分的读写可以跑满性能瓶颈。具体来说,小文件的随机读写可以在万兆局域网内跑出大约 500M/s 的速度,这基本是这两块 SSD 的随机读写性能的平均水平。大文件的顺序读写可以在万兆局域网内达到 6G+/s ,这也基本达到了 SSD 的性能极限。
2. 以上性能的前提是,数据集是在最近刚刚经过预处理而写进 LVM 的,这意味着使用场景符合 LVM“最近写入的数据往往会在短时间内被读取”这一假设。
在 ZFS 上:
大部分情况下多线程的综合读写(顺序+随机混合)最高可以达到 1.7G/s 左右,这也在纯 HDD 组合成的 RAID-Z2 阵列下的合理范围。
**一些补充结论**
1. 这台 NAS 与 iBug 非常熟悉的镜像站的使用场景有比较大的差别,主要在于读写数据的方式和频率不同。尽管依然存在文件大小带来的随机读写或顺序读写的区别,但这台 NAS 服务的对象并不是来自五湖四海访问镜像站的开发者们,而是几个确定的工作站并且有规划地进行数据的读写。这意味着读写由于相对有计划并其数据形式可预测,进而可以提前规划数据的流向,把需要 SSD 承接的部分尽可能让 SSD 承担,同时有计划地将“降温”的数据打包(从而将许多小文件变成一个大文件)落盘到更适合顺序读写的存储中。在这样的使用场景下,LVM+SSD Cache 依然可以通过一定的配置带来相当不错的收益。
2. LVM 本身的设计缺陷依然存在并且依然需要一些 tradeoff 。比如来自 UTSC 的同学们踩坑踩出来的 chunk size 和 blocks 数量等配置问题,以及脏块迁移问题。或许对于不同的场景,依然需要更加灵活、现代、先进的缓存适应和管理技术。在经过了一些调研后逐渐发现缓存和存储系统的优化一直是也将在很长时间内依然是学术界和工业界深入研讨的问题。在此向许多在这一领域辛勤探索的先驱者们致敬。
3. 一些方案的优点并不是绝对的,而是在某个特定的场景下,某种特定的需求中才会被体现出来。例如 iBug 倾情推荐的纯 ZFS 方案,本身是一个非常优秀的方案。我在配置和使用过程中也深刻体会到了这个方案本身的先进性。但不得不承认,这个方案对于镜像站这样一个内存充足、读取远大于写入的特殊场景下过于适应,以至于人们容易忘记在一些限制,例如空间、内存、经费有限的场景下,这个方案的优势可能难以发挥出来。一些人引以为豪的好主意,在忽略了讨论问题的背景和题设的情况下,这样的答案也没什么建设性。总的来说,还是要根据自己需求和一定的知识储备,选择适合自己的方案。
非常感谢所有参与讨论的朋友们,愿大家合家欢咯,万事如意~