基于 truenas/zfs 是否有较好的冷热数据 smb 无感访问的方案

2023-06-12 22:13:56 +08:00
 23f0baf3
大家好,现在有一台 NAS 配置了万兆,128G 内存,16 核 CPU ,16TBx9 RAIDZ3 zfs ,安装了 truenas 。另外有 2TB nvme 的硬盘目前没有使用。想问请问下是否有较好的冷热数据 smb 无感访问的方案?

目前大概情况如下,一天可能会处理上百 G 的数据,中间需要频繁进行数十 G 的大文件和数万个小文件读写,数据逻辑结构清晰,每个数据一个文件夹就可以,目前使用 smb 挂载 ZFS 的机械盘分区发现性能较弱,大文件往往只能跑到 500-600M/s ,小文件 80-100M/s 。希望使用上 NVME 硬盘达到性能优化。

主要想法:每日数据在 NVME 硬盘进行处理,下班后等空闲时同步一份到机械盘,NVME 盘空间不足一定量后进行释放。但是希望能无感在 SMB 中访问,不要用户手动拷来拷去。就是访问时 NVME 盘中有文件夹的就用 NVME 的,没有文件夹的直接读机械的,不需要对机械进行读 cache 类操作。

目前了解上 ZFS 的技术 ARC,L2ARC,ZIL 等似乎都和需求不是特别匹配,也欢迎大佬给出建议。
1866 次点击
所在节点    NAS
8 条回复
AkaGhost
2023-06-12 22:31:51 +08:00
TrueNAS 可以用:
只读缓存:ARC/L2ARC
如果你说同步写入也想要优化就用 SLOG 。

---

上述方法不好用的话,可以尝试自己搓个脚本,定时把文件都 mv 到机械硬盘里,然后软链接到 NVME 的挂载点里。

---

楼主可以看看: https://www.utopiafar.com/2022/03/26/how_to_improve_zfs_performance_on_freenas
Jirajine
2023-06-12 22:34:51 +08:00
overlayfs 和你描述的需求一模一样。
把 nvme 挂载到 hdd 的上层,这样 nvme 里有的文件会访问 nvme 的,没有的会访问 hdd 的。
23f0baf3
2023-06-12 22:51:40 +08:00
@wyf001912hp 这几个我大概了解过,读缓存来说 ARC 不是把几十 G 的数据放缓存里其实命中率很低,然后写缓存来说似乎这些都是优化同步写入的,而 smb 是异步写入,我理解异步写入是内存缓存,很快会被释放。ZIL ,SLOG 之类的缓存似乎也会较快释放不会长时间大规模的保存。
楼下说的 overlayfs 可能确实比较符合我的需求,可能会用 overlayfs 加计划任务脚本实现吧
aru
2023-06-12 23:48:36 +08:00
overlayfs 不能实现
overlayfs 的底层( hdd) 是不能修改、新增、删除的
chronos
2023-06-13 13:41:21 +08:00
https://github.com/trapexit/mergerfs 这个应该比 overlayfs 更适合你的场景。每日操作的数据直接放到 nvme 上,通过 mergerfs 将 hdd 和 nvme 合并到一个目录,使用 smb 开放服务,再跑个定时脚本去迁移数据。
chronos
2023-06-13 13:49:26 +08:00
mergerfs 创建文件有多种规则可以选,比如使用 epmfs 时当 nvme 存在文件夹 A 时,在 mergerfs 挂载的目录下的 A 目录中创建文件时就会创建到 nvme 里。如果 nvme 空间不足,会自动创建到 hdd 中。

mergerfs 还支持在线迁移文件和在线修改子挂载选项,只要当前文件没有在打开状态,可以直接 mv 或 rsync --remove-source-files 之类的方式迁移到 hdd 上。
EvineDeng
2023-06-15 10:47:27 +08:00
我的推荐也是 mergerfs ,保留 nvme 和 hdd 本来的各自的挂载点,新增一个 mergerfs 合并后的挂载点(可以选择不同的 merger 策略,见 @chronos 提供的链接的官方文档),平时使用就用合并后的挂载点。另外搞个脚本,定期把 nvme 的内容 rsync 到 hdd (使用原本各自的挂载点),然后再依据 nvme 的剩余空间大小和文件的 Access Time 或者 Modify Time 或者 Change Time 来删除定量的文件。
EvineDeng
2023-06-15 12:14:22 +08:00
另外,还有一个 SHELL 脚本: https://github.com/graysky2/anything-sync-daemon ,这个主要是指定目录,让内存作为其缓存,然后定期将内存中的东西写入到 HDD/SDD 。你的需求不能直接用这个,要对 common
/anything-sync-daemon.in 进行改造,改成你的需求。也可以结合 mergerfs 一起使用。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/948144

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX