And*_*nih 1 linux filesystems mount
我的应用程序架构要求我在同一分区挂载 2 个文件夹并在它们之间移动 2 个文件。我有以下坐骑:
/drive2/folder1 on /var/www/myapp/folder1 type none (rw,bind)
/drive2/folder2 on /var/www/myapp/folder2 type none (rw,bind)
Run Code Online (Sandbox Code Playgroud)
问题在于在 2 个文件夹/var/www/myapp/folder1
和/var/www/myapp/folder2
. 1Gb 文件大约需要 10 秒:
mv /var/www/myapp/folder1/test /var/www/myapp/folder2/
Run Code Online (Sandbox Code Playgroud)
而且它还会产生高磁盘活动。但是,当我在/drive2/folder1
和之间移动同一个文件时,移动/drive2/folder2
它需要不到一秒钟的时间。
任何人都可以告诉我这个问题吗?
在文件系统之间移动时,文件被复制到目标,然后在源上删除。在本地文件系统上移动时,只更新文件系统表,这花费的时间要少得多。显然,对于绑定安装, mv 将这两点视为单独的文件系统。
我在本地系统上设置了类似的挂载并运行了strace mv folder1/1gb folder2/
.
lstat("folder1/1gb", {st_mode=S_IFREG|0644, st_size=1000000000, ...}) = 0
lstat("folder2/1gb", 0x7fff30fd1e20) = -1 ENOENT (No such file or directory)
rename("folder1/1gb", "folder2/1gb") = -1 EXDEV (Invalid cross-device link)
unlink("folder2/1gb") = -1 ENOENT (No such file or directory)
open("folder1/1gb", O_RDONLY|O_NOFOLLOW) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=1000000000, ...}) = 0
open("folder2/1gb", O_WRONLY|O_CREAT|O_EXCL, 0600) = 4
fstat(4, {st_mode=S_IFREG|0600, st_size=0, ...}) = 0
read(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 32768) = 32768
write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 32768) = 32768
......
Run Code Online (Sandbox Code Playgroud)
其他文件夹 1 和文件夹 2 实际上在同一个文件系统上,重命名系统调用失败,错误报告目的地在不同的设备上。除了修改内核和/或核心库之外,我怀疑您可以做很多事情来改变这一点。
归档时间: |
|
查看次数: |
1831 次 |
最近记录: |