移动2TB(1000万个文件+目录),我的瓶颈是什么?


21

背景

跑出空位/home/data需要,并转移/home/data/repo/home/data2

/home/data/repo包含1M个目录,每个目录包含11个目录和10个文件。总计2TB。

/home/data在启用了dir_index的ext3上。 /home/data2在ext4上。运行CentOS 6.4。

我认为这些方法之所以缓慢,是因为repo/在其正下方有100万个目录。


尝试1:mv很快但被打断

如果完成,我可以完成:

/home/data> mv repo ../data2

但在转移1.5TB后中断。它的写入速度约为1GB / min。

尝试2:rsync在建立文件列表8小时后进行爬网

/home/data> rsync --ignore-existing -rv repo ../data2

建立“增量文件列表”花费了几个小时,然后以100MB / min的速度传输。

我取消它以尝试更快的方法。

尝试3a:mv抱怨

在子目录上对其进行测试:

/home/data/repo> mv -f foobar ../../data2/repo/
mv: inter-device move failed: '(foobar)' to '../../data2/repo/foobar'; unable to remove target: Is a directory

我不确定这是什么错误,但也许cp可以让我摆脱困境。

尝试3b:cp8小时后无济于事

/home/data> cp -nr repo ../data2

它会读取磁盘8个小时,因此我决定取消磁盘并返回rsync。

尝试4:rsync建立档案清单8小时后进行检索

/home/data> rsync --ignore-existing --remove-source-files -rv repo ../data2

我曾经--remove-source-files认为如果现在开始清理,它可能会使其更快。

建立文件列表至少需要6个小时,然后以100-200MB / min的速度传输。

但是服务器一夜之间负担很重,我的连接关闭了。

尝试5:只有300GB左右空间,为什么会这么痛

/home/data> rsync --ignore-existing --remove-source-files -rvW repo ../data2

再次中断。在-W几乎似乎让“发送增量文件列表”更快,这对我的理解不应该是有意义的。无论如何,传输速度非常慢,我放弃了这一步。

尝试6: tar

/home/data> nohup tar cf - . |(cd ../data2; tar xvfk -)

基本上是尝试重新复制所有内容,但忽略现有文件。它必须经过1.7TB的现有文件,但至少以1.2GB / min的速度读取。

到目前为止,这是唯一可以立即得到满足的命令。

更新:甚至以nohup再次中断。

尝试7:rak立

还在争论这个

尝试8:脚本与“合并” mv

目标目录中有大约12万个空目录,所以我跑了

/home/data2/repo> find . -type d -empty -exec rmdir {} \;

Ruby脚本:

SRC  = "/home/data/repo"
DEST = "/home/data2/repo"

`ls #{SRC}  --color=never > lst1.tmp`
`ls #{DEST} --color=never > lst2.tmp`
`diff lst1.tmp lst2.tmp | grep '<' > /home/data/missing.tmp`

t = `cat /home/data/missing.tmp | wc -l`.to_i
puts "Todo: #{t}"

# Manually `mv` each missing directory
File.open('missing.tmp').each do |line|
  dir = line.strip.gsub('< ', '')
  puts `mv #{SRC}/#{dir} #{DEST}/`
end

完成。


您是正确的,它必须查找并枚举每个目录,而一百万个目录将是痛苦的。
cybernard 2013年

2
看看光明的一面...如果是Windows,则什至没有一百万个子目录,但仍然有一个可以运行的操作系统。:)
杰克

1
@Tim,你为什么不再来mv一次?从理论上讲,mv只有在目标文件已完全复制后才删除源文件,这样就可以正常工作。另外,您对计算机有物理访问权还是通过ssh连接完成的?
terdon

5
不,它不能。mv不能原谅,如果您一直断开连接,则可能会丢失数据甚至不知道它。正如您所说的那样ssh,我强烈建议使用screen和分离。启用日志记录并保持跟踪。如果您使用的是详细信息,则需要更长的时间。也可以尝试iotop
justbrowsing 2013年

2
@justbrowsing-呼吁大家screen。我想知道冗长的内容,但tar现在重新启动为时已晚。iotop在最近几天里,它一直是我最喜欢的实用工具:)
Tim

Answers:


6

听说过将大型任务拆分为较小的任务吗?

/ home / data / repo包含1M个目录,每个目录包含11个目录和10个文件。总计2TB。

rsync -a /source/1/ /destination/1/
rsync -a /source/2/ /destination/2/
rsync -a /source/3/ /destination/3/
rsync -a /source/4/ /destination/4/
rsync -a /source/5/ /destination/5/
rsync -a /source/6/ /destination/6/
rsync -a /source/7/ /destination/7/
rsync -a /source/8/ /destination/8/
rsync -a /source/9/ /destination/9/
rsync -a /source/10/ /destination/10/
rsync -a /source/11/ /destination/11/

(...)

喝咖啡休息时间。


1
我隐约强调的好处是,可以手动跟踪小零件的进度,这样,如果某些零件被中止(因为您知道哪些步骤已成功完成),则恢复任务将花费更少的时间。
ЯрославРахматуллин

基本上,这是我最后要做的,除了mv。不幸的是,没有工具开会mvrsync中途。
蒂姆(Tim)

4

这是正在发生的事情:

  • 最初,rsync将构建文件列表。
  • 由于文件列表的初始排序,因此构建此列表的速度确实很慢。
  • 通过使用ls -f -1并将其与xargs组合以构建rsync将使用的文件集,或者将输出重定向到带有文件列表的文件,可以避免这种情况。
  • 将此列表传递给rsync而不是文件夹,将使rsync立即开始工作。
  • 在具有数百万个文件的文件夹上使用ls -f -1的技巧在本文中得到了完美描述:http : //unixetc.co.uk/2012/05/20/large-directory-causes-ls-to-hang/

1
您能否举一个如何将ls与rsync一起使用的示例?我有一个相似但不完全相同的情况。在机器AI上,rsyncd正在运行,并且我想将大型目录树传输到机器B(实际上,目录的90%已在B上)。问题是我必须使用经常掉线的不稳定移动连接来执行此操作。每次重新启动时,花一个小时来构建文件列表都是非常低效的。另外,B在我无法控制的NAT后面,因此很难连接A-> B,而B-> A很容易。
db 2015年

同意@db。如果可以举一个例子,那将使这个答案更加有用。
redfox05

1

即使rsync很慢(为什么它很慢?也许-z会有所帮助),听起来您已经把它移了很多,所以您可以继续尝试:

如果使用了--remove-source-files,则可以通过删除空目录来进行后续操作。--remove-source-files将删除所有文件,但会将目录保留在那里。

只要确保您不要将--remove-source-files与--delete一起使用即可进行多次传递。

也可以使用--inplace来提高速度

如果因为尝试在服务器上远程执行而被赶出场,请继续并在“屏幕”会话中运行它。至少您可以这样运行它。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.