This topic created in 1829 days ago, the information mentioned may be changed or developed.
需求:
- 多个进程可以从同一个路径读取文件,这些进程也可以同时修改同一个文件
- 但是每个进程对文件的修改都是独立的,一个进程的修改不会影响到另一个进程的读写
- 每个进程修改的文件都被单独保存到自己的私有目录,但是对该进程透明,该进程感受不到文件路径的变化
- 不用 docker 这些容器来实现(好像用了也不行)
问题:
多个独立的进程(互相之间都认为自己是独占一个目录的)对同一个文件目录会产生大量读(只读文件)和少量写(日志文件)的操作,不想为每个进程单独复制一份各自的文件目录(数据量较大,而且进程的数量不定,会产生大量的重复复制)
Supplement 1 · Jun 8, 2021
overlayfs 跟 aufs 在大的二进制文件有修改的时候会发生全复制,pass 掉
只能试试 brtfs 跟 zfs 了
Supplement 2 · Jun 8, 2021
建立完 brtfs 分区后,用 cp -R --reflink=always -a SRC DEST
即可实现题中的需求,不足之处是 brtfs 本身性能有点差
14 replies • 2021-06-09 00:11:58 +08:00
 |
|
2
ch2 Jun 8, 2021
@ janus77 读写是并行的,而且是二进制文件,git 不太行
|
 |
|
3
no1xsyzy Jun 8, 2021 1
CoW 的话,ZFS 和 Btrfs 都能通过 dedup 来做到。 除此以外也可以用 overlayFS ?
说实话,第一反应是内存,fork() 就是 CoW 的。
|
 |
|
5
XiaoxiaoPu Jun 8, 2021 1
文件路径对进程透明,需要 chroot linux 下支持写时复制的文件系统,可以用 Btrfs
粗略看可行的方案,是使用 Btrfs 的快照功能,要启动进程前,创建一个新的快照,chroot 快照,启动进程
|
 |
|
7
SingeeKing Jun 8, 2021
自己基于 FUSE 写一个不难,但不确定是否可以感知到读的进程
|
 |
|
8
generic Jun 8, 2021 via Android
overlayfs 。
|
 |
|
9
jim9606 Jun 8, 2021 1
使用支持 Reflink 的文件系统,CoW 的文件系统是最佳方案( ZFS 、BtrFS 甚至不需要打开 dedup 都能做到),非 CoW 文件系统中 OverlayFS 、XFS 也可以支持
不同程序先通过 cp --reflink=always 创建轻量副本,之后所有修改都放在私有副本上进行。
不过需要注意这些方法都不可避免产生文件碎片,虽然节省空间但 IO 性能可能会下降。
|
 |
|
11
yanqiyu Jun 8, 2021 1
btrfs+snapshot/reflink+mountns? 做一个启动器,任务就是吧目标文件所在的子卷做一个快照或者路径做一个 reflink,然后创建 mountns 设置好新的挂载点保证对于程序透明,然后执行程序?
|
 |
|
12
muzuiget Jun 8, 2021
应该是 overlayfs,相当于在一个文件系统快照上操作。
|
 |
|
13
lqf96 Jun 8, 2021 via iPhone 1
再提供一个办法:lvm 有 block-level 的 cow 支持,可以适用各种文件系统,docker 应该也有相应的后端…
|
 |
|
14
itplanes01 Jun 9, 2021 via Android
几周前装的 Fedora 34 btrfs 在安装软件时崩了,数据全无
|