需要Linux的多线程文件副本

时间:2012-01-27 13:31:40

标签: multithreading file copy

我每天都需要复制“大量”数据。 (6TB)

它是通过光纤通道从SAN呈现的15个磁盘,并被复制到由22个磁盘组成的本地阵列。

sources are 
/mnt/disk1
/mnt/disk2
/mnt/disk3

destination is
/mnt/Data/SystemBackup/

由于SAN的性质,单线程文件复制速度不是很快;但如果我们以正确的方式提出它,它的能力就达到600 + mb / sec。 :)我需要一种方法来生成文件副本中的多个线程。在Windows中有很多方法可以做到这一点......但我找不到Linux可用的任何本机方法。

像Python或Perl这样的东西可以提供帮助吗?有什么我想念的吗?你的想法是什么?

编辑: (请注意,我使用的是gnutils cp的修改版本。)请点击此处获取更多信息:http://www.usenix.org/event/lisa10/tech/slides/kolano.pdf

Edit2:代码

#!/bin/bash

# Declare the foo
OPTIONS="-r --double-buffer --threads=8"
dstdir="/mnt/Data/PrUv2Backup/"
mcp=/root/mcp

# Cleanup old timestamp file
rm -rf PrUv2CopyTimes.log

# Declare array of source locations
srcdirs=(
PrUv2-home
PrUv2-trax
PrUv2-trax2
PrUv2-trax3
PrUv2-traxnl
PrUv2-traxnl2
PrUv2-traxnl3
PrUv2-traxnl4
PrUv2-traxnv
PrUv2-traxnv2
PrUv2-ulog
PrUv2-zmops
PrUv2-zmops2
PrUv2-zmops3
PrUv2-zmops4
)


for srcdir in "${srcdirs[@]}"

do
        echo `date +"%r"` $srcdir start  >> PrUv2CopyTimes.log
        $mcp $OPTIONS /mnt/$srcdir/ $dstdir
        echo `date +"%r"` $srcdir finish >> PrUv2CopyTimes.log
done

# email results
cat PrUv2CopyTimes.log | mailx -r LouPrBoxen001 -s "Backup Complete" me@us.com

2 个答案:

答案 0 :(得分:0)

刚刚获得ultracopier,您可以尝试一下。

答案 1 :(得分:0)

不确定这是否适用于原始问题,因为SAN不是主机,只是网络存储阵列。也许您可以找到SAN附近的主机作为额外的主机。

如果您需要通过网络将大量小文件从一个主机复制到另一个主机,您会发现需要很长时间。一个接一个地复制每个文件,带宽几乎没有。有一种技术可以动态压缩文件和目录,并通过接收主机正在侦听的原始网络端口进行管道传输,然后在目标上进行解压缩。这会导致复制过程创建一个重定向到网络端口的巨大单个文件,这将很好地使网络饱和。结果是它会加速它并且您不需要源主机上额外的肘部空间,因为压缩永远不会到达磁盘但是会通过管道重定向到原始网络端口。这非常有效,是使用USB Linux系统启动笔记本电脑并将数据提取到远程主机的好方法。或者从远程服务器复制。

接收者:

nc -l 3245 | bunzip2 -vvv | tar -x

发件人:

tar -c文件夹/ | bzip2 -vv9 | nc 10.1.1.5 3245

也可以创建一个ssh隧道,并在该加密隧道上使用netcat。

根据单个文件的大小,这可以节省多达40%或更多的复制时间。如果你有大文件,这并不重要,因为每个文件都有时间自己饱和网络带宽。这对于许多小文件最有用。