rsync,包含300万个文件的目录,它能跟得上吗?

rsync, directory containing 3 million files, can it keep up?

我正在 mac 计算机上通过终端使用 bash 命令。

我是 运行 一名 DNA 测序仪,可在 48 小时内生成约 3-5 百万个文件。出于速度原因,这些文件将保存到计算机的 SSD 中。我想使用 fswatch 和 rsync 命令来监视目录并在生成这些文件时将这些文件传输到服务器,以减少长时间的传输时间 post 排序。

这是我想出的命令。

fswatch -o ./ | (while read; do rsync -r -t /Source/Directory /Destination/Directory; done)

但我担心,由于文件数量超过 300 万,总大小超过 100 GB,这些工具可能难以跟上。有没有更好的策略?

感谢您的帮助!

文件系统限制可能会成为问题。

看到这个答案:How many files can I put in a directory?

一般来说,目录中的文件越多,文件系统的执行速度就越慢。

您将使用的命令可能有效,但会出现一些我希望避免的性能问题。

  • "fswatch" 会在 FS 的每次修改时生成输出(例如每次文件更新。
  • "rsync" 每次都会递归检查目录及其子目录和文件中所有可能的更改。 (不计算实际的数据拷贝,只有当源和目标中有大量文件和目录时,这个操作会花费很长时间)

这意味着 "fswatch" 输出的每一行都会启动一个 "rsync" 实例,而 "rsync" 的持续时间会越来越长。

48 小时是很多时间,复制文件 (~100GB) 也不会花那么长时间(磁盘到磁盘非常快,通过千兆网络也非常快)。

相反,我建议在生成过程中定期(例如 30 分钟)执行 rsync -a --delete /source /destination,并在最后执行一次,以确保没有遗漏任何内容。一个简短的脚本可以包含:

#!/bin/bash
while ps -ef | grep -q "process that generates files"; do
    echo "Running rsync..."
    rsync -a --delete /source /destination
    echo "...waiting 30 minutes"
    sleep 1800 # seconds
done
echo "Running final rsync..."
rsync -a --delete /source /destination
echo "...done."

...只需将 "process that generates files" 替换为生成文件的进程在 "ps -ef" 输出中看起来像的任何名称,而它是 运行ning。根据您的需要调整时间,我认为在 30 分钟内创建了 ~2GB 的数据,可以在几分钟内复制。

该脚本将确保 "rsync" 不会 运行 超过它应有的次数,并且它会专注于复制文件而不是经常比较源和目标。

选项“-a”(存档)将暗示您使用的选项以及更多选项 (-rlptgoD),“--delete”将删除存在于“/destination”但不存在于“/source”(在复制但在最终结构中实际不需要的临时文件的情况下很方便)。