当写入磁盘(SATA)时,我注意到 tar 似乎对性能有很大影响。我正尝试从我的客户端(OSX)通过我的本地网络复制一个相对较大的 .dmg 文件(556MB),作为备份到我的服务器(debian)。尝试典型方法的结果在传输速度、客户端吞吐量和服务器 I/O 方面都相当糟糕
对于 I/O 监控,iostat -Ndx 1
服务器iotop -oa
上使用了
scp:服务器上客户端 I/O 的~18 minutes
吞吐量 ()~500KB/s-540KB/s
~800kB/s-1100kB/s
time scp <my_file> user@host:/path/to/dir/
sftp:服务器上客户端 I/O~9 minutes
吞吐量提高约 50% ,但由于我使用了 cyberduck gui,因此无法编写脚本~1MB/s
~1500kB/s-2000kB/s
进一步研究发现这个帖子因此我尝试了以下方法:
在客户端上:(
)tar -cf - <my_file> | pv -s $(du -sb <my_file> | awk '{print $1}') | nc -l 8888
在服务器上:(
)nc <source_ip> 8888 | tar xf -
笔记:我放弃了pigz
使用,因为它似乎导致客户端的吞吐量0 Kb/s
在传输过程中频繁下降。
这产生了最差的结果,~33 minutes
客户端的吞吐量为~300-400KB/s
,服务器的 I/O~800-1200KB/s
分别在最后 5 分钟内下降到约~200KB/s
和 I/O ~800KB/s
。
为了确保不是网络问题,我将服务器修改为(nc <source_ip> 8888 > /dev/null
),传输时间降至,~2minutes
客户端吞吐量为~6-7MB/s
。
通过在手册页中进行更多搜索,我决定将块大小(-b, --blocking-factor
)修改为更高的值,即 128、512、1024 等……这产生了更好的写入性能,与-b1024
重定向测试相当/dev/null
。手册页似乎相当过时,仅提到与写入磁带有关的此选项的更改,而未提及现代媒体。这样做是否会对数据完整性产生负面影响?通过此修改,并根据手册页,我假设 tar 试图以 512 字节的块写入数据,因此通过将其修改为 512*1024,即 512KB 的块,我不知道操作系统写入此内容是否会有问题。
編輯:
最初是在电脑之外发布的,所以我更新了实际使用的命令,提供了更准确的时间,并修复了拼写错误。还尝试了下面建议的 scp 加密,并包含了结果
scp:服务器上客户端 I/O 的~17.5 minutes
吞吐量 ()~500KB/s-540KB/s
~1100kB/s-1500kB/s
scp -C <my_file> user@host:/path/to/dir/
修改块大小后:~42 seconds
客户端的吞吐量和服务器上的 I/O~15MB/s
客户: (tar --disable-copyfile -cf - <my_file> | pv -s $(du <my_file> | awk '{size = $1 * 512} END {print size}') | nc -l 8888
)
服务器: (nc 10.0.1.28 8888 | tar -b1024 -xf -
)
答案1
根据文件的内容,scp
如果通过添加选项启用压缩,您可能会获得更短的方法时间-C
。
对于这种nc
方法,您可以tar
从图片中删除,因为您只传输一个文件(tar
其主要功能是将多个目录和文件复用/解复用到单个数据流中):
nc -l 8888 < <my_file>
nc <source_ip> 8888 > <my_file_copy>
您nc
也可以尝试使用以下方法进行压缩:
cat <my_file> | gzip - | nc -l 8888
nc <source_ip> 8888 | zcat - > <my_file_copy>
由于加密/解密已经不存在,因此总体而言速度nc
可能更快。scp
如果你仍然想使用,tar
那么是的,阻塞因素非常重要。参见文档和此问答例如。顺便说一下,tar 的块大小是 512字节, 不是知识库。