碳基体

奋斗在产品安全第一线的安全妹子

bbcp-局域网中大文件的快速传输

需求:

1. 局域网中传输大文件,文件大小大于100G

2. 无加密要求

3. 文件完整性要求低

4. 越快越好


结论:

bbcp


使用实例:

一、安装(传输的双方机器都需要安装同版本的可执行文件)

wget http://www.slac.stanford.edu/~abh/bbcp/bbcp.tgz


tar zxvf bbcp.tgz

cd bbcp/src/

make

cp bbcp/bin/amd64_linux26/bbcp /usr/bin/

二、使用

/usr/bin/bbcp -F -P 2 -V -w 10m -s 16 -T 'ssh -x -a -oFallBackToRsh=no %I -l %U %H /home/xxx/bin/bbcp'

src_file_path user@host:/home/xxx/dest_file_path

选项说明

-F: 不检查目的机器的磁盘空间大小是否还够

-P: 指定每个进程的启动时间,单位s

-w: 磁盘IO buffer大小

-s: 并发streams数 

-T 指定如何远程启动bbcp

-V: 显示传输详细细节


三、优化

可以使用以下选项来加快传输速度

1. 关闭域名查找

-n

2. 磁盘IO buffer大小与并发streams数的合理设置

传输是否快取决于机器的内存和带宽,上面两个数值在内存不会耗尽的情况下理论上是设置越大越好,当然实际情况要找到一个平衡点。


参考http://pcbunn.cithep.caltech.edu/bbcp/using_bbcp.htm 给出的测试数值:

a. 并发streams数的设置

局域网中 -s 设置为16或32比较好


b.磁盘IO buffer大小的设置

可以使用iperf来获得带宽数量

服务端

iperf -s

客户端

iperf -c server_ip -t 60 -i 2 -w 200k -n 10400000 -d

-t 测试时间

-i 以秒为单位显示报告间隔

-w 指定TCP窗口大小,默认8k

-n 指定传输的字节数

-d 进行双向传输测试

[  5]  0.0- 1.1 sec  10.0 MBytes  76.5 Mbits/sec

那么窗口大小设置为

-w 0.5*76.5比较合适


四、问题

再次感叹自己的bug体质

1. bash: bbcp: command not found

找不到目的机器的bbcp路径

首先查看一下默认的bbcp路径

ssh user@host which bbcp

然后copy或建立符号链接到bbcp目标路径

如果没有权限将bbcp移动到指定路径,可以使用 -T 指定bbcp路径

-T 'ssh -x -a -oFallBackToRsh=no %I -l %U %H /home/xxx/bin/bbcp'


2. bbcp: Insufficient space to copy all the files

bbcp在传输的过程中会检查目的机器的磁盘空间大小,当然这个空间大小的探测可能不准确。

可以使用 

-F 选项关闭磁盘大小检测


3.bbcp: No space left on device writing

目的机器真的磁盘空间不够,整理整理吧,以我的经验不少磁盘空间不够是因为被标记删除的文件仍在被进程使用造成。

可以使用以下命令杀死这些进程

lsof | grep deleted|while read abc;do kill -9 $abc;done



参考:

http://pcbunn.cithep.caltech.edu/bbcp/using_bbcp.htm

https://www.olcf.ornl.gov/kb_articles/transferring-data-with-bbcp/

http://www.slac.stanford.edu/~abh/bbcp/

https://www.52os.net/articles/iperf-check-bandwidth.html

来源:碳基体

评论