我应该禁用 /var/lib/docker 的 btrfs CoW 吗?

我应该禁用 /var/lib/docker 的 btrfs CoW 吗?

我发现对于大文件(例如 PostgreSQL 数据库的数据目录)使用 btrfs CoW 功能不是一个好主意。

由于我使用 docker 来处理数据库,我现在问自己,是否应该禁用整个/var/lib/docker目录的 CoW。但我不确定,因为 docker 的分层文件系统是否利用了此功能?

或者是否有可能仅对某些特定卷禁用 CoW?

答案1

我不认为docker它直接插入 BTRFS(或任何文件系统)CoW 行为;相反,它可以使用快照和/或重新链接来避免复制整个容器映像。

虽然禁用 CoW 肯定会有利于性能,但请注意:

  • 禁用它意味着没有数据校验和,因此无法防止数据丢失;
  • 对卷进行快照将自动重新启用 CoW;
  • reflink 将不再起作用;
  • 现有文件将保持 CoW 启用状态(直到您删除并重新创建它们)。

虽然对于数据库(如 PostgreSQL)而言,上述几点可能不是什么问题(即:数据校验和在数据库记录级别完成,快照由事务层提供),但对于缺少这些功能的 VM 或容器来说可能会有问题。

无论如何,我真的建议你读一下BTRFS 关于 nodatacow 的常见问题

答案2

输入以下内容/etc/docker/daemon.json

{
    "storage-driver": "btrfs"
}

如果卷包含数据库,请禁用卷上的写时复制功能:

mkdir /var/lib/docker/volumes
chattr +C /var/lib/docker/volumes

希望有所帮助。

相关内容