V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
23f0baf3
V2EX  ›  NAS

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

  •  
  •   23f0baf3 · 319 天前 · 1572 次点击
    这是一个创建于 319 天前的主题,其中的信息可能已经有所发展或是发生改变。
    大家好,现在有一台 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 等似乎都和需求不是特别匹配,也欢迎大佬给出建议。
    8 条回复    2023-06-15 12:14:22 +08:00
    AkaGhost
        1
    AkaGhost  
       319 天前
    TrueNAS 可以用:
    只读缓存:ARC/L2ARC
    如果你说同步写入也想要优化就用 SLOG 。

    ---

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

    ---

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

    mergerfs 还支持在线迁移文件和在线修改子挂载选项,只要当前文件没有在打开状态,可以直接 mv 或 rsync --remove-source-files 之类的方式迁移到 hdd 上。
    EvineDeng
        7
    EvineDeng  
       317 天前
    我的推荐也是 mergerfs ,保留 nvme 和 hdd 本来的各自的挂载点,新增一个 mergerfs 合并后的挂载点(可以选择不同的 merger 策略,见 @chronos 提供的链接的官方文档),平时使用就用合并后的挂载点。另外搞个脚本,定期把 nvme 的内容 rsync 到 hdd (使用原本各自的挂载点),然后再依据 nvme 的剩余空间大小和文件的 Access Time 或者 Modify Time 或者 Change Time 来删除定量的文件。
    EvineDeng
        8
    EvineDeng  
       317 天前
    另外,还有一个 SHELL 脚本: https://github.com/graysky2/anything-sync-daemon ,这个主要是指定目录,让内存作为其缓存,然后定期将内存中的东西写入到 HDD/SDD 。你的需求不能直接用这个,要对 common
    /anything-sync-daemon.in 进行改造,改成你的需求。也可以结合 mergerfs 一起使用。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2849 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 07:06 · PVG 15:06 · LAX 00:06 · JFK 03:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.