坑边闲话:闲话

Debian bookworm 的 backport 频道正式推送了 OpenZFS 2.3.1, 没错,就是这么快!

一般来说,作为社区 package 打包维护者,不太可能在 1.0, 2.0, 3.0 就积极引入,第一个小版本 如 2.01, 3.01 才是引入的最佳时间。这种版本

  • 和大版本整数发布不会有很长的间隔
  • 功能和大版本整数版基本相同
  • 修复了整数版本无心之失产生的一些小问题

我第一时间进行了更新,然后开启了 direct-IO 进行了测试。

总体来看,性能表现和我预料的差不多。

写操作·

direct-IO 在写入方面和 buffered-IO 没有太大区别,之所以写入速度没有突飞猛进,主要是 ZFS 的瓶颈在 ZIO 后端上,把压缩、去重、加密全部关掉,速度也没有太多提升。本质上是因为 ZFS 希望尽可能多地合并写入,把多个 write 合并为一个合适的 record. 然而,这种优化逻辑是为机械阵列而生的,全 nvme 闪存并不需要这个逻辑。

综上,direct-IO 并没有带来性能上的惊喜,但是这仍然属于一个重大的进步,因为它预示着接下来大规模优化 nvme ZIO 后端是可能的。

读操作·

至于读方面,direct-IO 自然不如 buffered-IO 那么快,但是基本能达到 SSD 的读取上限,这一点很不错。数据库类软件一般会有自己的内存缓存,所以在 ARC 里再缓存一遍就没必要了。这一点很不错,可以为非 NAS 场景的 ZFS 提供很好的优化,降低内存占用。

众所周知,ARC 本身就在 mmap 类型的 memory allocation 上有双重占用,再加上 buffered-io 场景下数据库自己的用户态内存缓存,这一下子就是三重内存占用。direct-IO 直接去掉了两层,内存占用降低 66.7%,听懂掌声!

有人担心没了 ARC 会不会导致性能下降?我觉得这个是多余的。

  • 基于 SQlite/PostgreSQL/MySQL 的程序会有自己的缓存,读自己的缓存比读 ARC 更快更合适,性能没有明显区别。
  • 如果程序完全依赖文件系统,自己没有做任何缓存优化,这一般是不太好的程序,建议赶紧丢掉。

bug·

目前 TrueNAS 还没有更新到 2.3.1,所以 TrueNAS 的 data protection 对远程 ZFS 的 pull/push 有一定版本要求,python3-libzfs 只支持 2.2.7 以下的 ZFS. 如果你使用 Netcat+ssh 进行 push/pull, 建议暂时切换到纯 ssh 模式。

以上是简单的测试心得,没有太多时间整理数据,各位且看且珍惜。