我发现对于大文件(例如 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
希望有所帮助。