我需要scp从machineB和machineC到machineA的文件。 我从machineA运行我的下面的shell脚本。 我已经正确设置了ssh密钥。
如果这些文件不在machineB ,那么它应该在machineC 。 我需要将所有PARTITION1和PARTITION2文件移动到machineA文件夹中,如下面的shell脚本所示 –
#!/bin/bash readonly PRIMARY=/export/home/david/dist/primary readonly SECONDARY=/export/home/david/dist/secondary readonly FILERS_LOCATION=(machineB machineC) readonly MAPPED_LOCATION=/bat/data/snapshot PARTITION1=(0 3 5 7 9) PARTITION2=(1 2 4 6 8) dir1=$(ssh -o "StrictHostKeyChecking no" david@${FILERS_LOCATION[0]} ls -dt1 "$MAPPED_LOCATION"/[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] | head -n1) dir2=$(ssh -o "StrictHostKeyChecking no" david@${FILERS_LOCATION[1]} ls -dt1 "$MAPPED_LOCATION"/[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] | head -n1) length1=$(ssh -o "StrictHostKeyChecking no" david@${FILERS_LOCATION[0]} "ls '$dir1' | wc -l") length2=$(ssh -o "StrictHostKeyChecking no" david@${FILERS_LOCATION[1]} "ls '$dir2' | wc -l") if [ "$dir1" = "$dir2" ] && [ "$length1" -gt 0 ] && [ "$length2" -gt 0 ] then rm -r $PRIMARY/* rm -r $SECONDARY/* for el in "${PARTITION1[@]}" do scp david@${FILERS_LOCATION[0]}:$dir1/t1_weekly_1680_"$el"_200003_5.data $PRIMARY/. || scp david@${FILERS_LOCATION[1]}:$dir2/t1_weekly_1680_"$el"_200003_5.data $PRIMARY/. done for sl in "${PARTITION2[@]}" do scp david@${FILERS_LOCATION[0]}:$dir1/t1_weekly_1680_"$sl"_200003_5.data $SECONDARY/. || scp david@${FILERS_LOCATION[1]}:$dir2/t1_weekly_1680_"$sl"_200003_5.data $SECONDARY/. done fi
目前,我在PARTITION1和PARTITION2中有5个文件,但一般情况下它会有大约420个文件,这意味着它会逐个移动文件,我认为这个文件可能会很慢。 有什么办法可以加快这个过程吗?
我正在运行Ubuntu 12.04
并行化SCP会适得其反,除非双方都在SSD上运行。 SCP最慢的部分是networking的枯竭,在这种情况下,并行将不会有任何帮助,或者任何一方的磁盘都是无用的,而这种情况会因为并行化而变得更糟:寻找时间会杀死你。
你说machineA在SSD上,所以每台机器的并行应该足够了。 最简单的方法是将第一个forloop包装在子shell中并将其放在后台。
( for el in "${PARTITION1[@]}" do scp david@${FILERS_LOCATION[0]}:$dir1/t1_weekly_1680_"$el"_200003_5.data $PRIMARY/. || scp david@${FILERS_LOCATION[1]}:$dir2/t1_weekly_1680_"$el"_200003_5.data $PRIMARY/. done ) &
您可以使用GNU Parallel来帮助您并行运行多个任务。
但是,在您的情况下,似乎您正在为每个文件传输build立一个单独的安全连接,这可能确实效率很低,尤其是在其他计算机不在本地networking中的情况下。
最好的方法是使用专门进行batch file传输的工具 – 例如rsync ,它也可以在普通的ssh上运行。
如果rsync不可用,可以使用zip ,甚至tar和gzip或bzip2 ,然后scp生成的文件(然后用ssh连接,然后解压缩)。
我已经有了一个问题,scp,两台机器在同一个networking与千兆连接,通过scp非常缓慢地传输。
如果你不需要encryption,它肯定会帮助你使用ftp或nfs。
我发现问题是其中一台机器的内存很慢,而sshencryption部分对这台机器要求很高。 使用ftp或nfs解决了我的问题,我从15-20 MB / s到100+ MBps。
[编辑]
我刚刚发现这使用优秀的rsync而不是scp。 不解决你的整个问题,但可以帮助。