需要 Linux 的多线程文件复制

问题描述 投票:0回答:2

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

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

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

destination is
/mnt/Data/SystemBackup/

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

Python 或 Perl 之类的东西有帮助吗?我有什么遗漏的吗?你怎么看?

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

编辑2:代码

#!/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" [email protected]
multithreading file copy
2个回答
0
投票

刚拿到ultracopier,你可以尝试一下。


0
投票

不太确定这是否适用于最初的问题,因为 SAN 并不完全是一个主机,只是一个网络存储阵列。也许您可以在 SAN 附近找到一台主机作为附加主机。

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

接收者:

nc -l 3245 | Bunzip2-vvv|焦油-x

发件人:

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.