你问“服务器拷资料哪个快”,直接给结论:多数情况下,用多线程rsync或fpsync配合iperf先测速,比单线程scp快3到5倍,但真正的瓶颈往往不在命令本身,而在磁盘IO、小文件数量和带宽协商机制。
先用10分钟找到拖慢速度的真凶
搞懂数据流的三个环节
服务器之间拷贝资料,数据要经过磁盘读取、网络传输、对端磁盘写入,任何一个环节拖后腿,再厉害的命令也白搭,业内专家指出,超过一半的“拷贝慢”问题出在源服务器磁盘的随机读性能上,尤其是机械硬盘阵列。
判断瓶颈在哪个环节,别靠猜,我建议你做两件事。
用iperf测纯网络吞吐,在源机和目标机分别跑iperf3 -s和iperf3 -c 目标IP -P 4,如果测出的带宽远低于机房标称的千兆或万兆,那问题在网络配置、防火墙或光模块上。
用dd测磁盘写入极限,在目标机执行dd if=/dev/zero of=/tmp/test bs=1M count=2048 conv=fdatasync,得到的结果就是磁盘能承受的极限写入速度。
文件大小决定策略
拷贝100个1GB的大视频文件,和拷贝10万个10KB的配置文件,完全是两个世界,前者拼的是顺序读写和带宽,后者拼的是IOPS和元数据吞吐,很多管理员发现rsync传小文件奇慢无比,这不怪rsync,而是每传一个文件都要建立会话、检查属性、确认校验,这些握手开销在小文件场景下被急剧放大。
行业共识认为,小文件占比超过三成时,直接用tar打包再传输往往比裸rsync更快。
scp和rsync哪个快?关键看场景
scp:简单直接但后继无力
scp基于SSH协议,加密开销真实存在,但真正的问题是单线程,无论你的服务器带宽是千兆还是万兆,scp默认只会用一条流去推数据。在杭州机房同城千兆内网,传一个20GB的压缩包,scp速度通常在80MB/s到110MB/s之间,这个速度看着不慢,但万兆环境下它就是天花板,因为加密和单线程的双重限制锁死了吞吐量。
rsync:增量同步是杀手锏
rsync的最大价值不是初始拷贝,而是断点续传和增量同步,传输中途断网,重跑一遍相同的命令,它会跳过已经传完的部分,对于持续更新的业务数据,第一次全量用rsync -avz,之后每次只传差异部分,这是任何scp做不到的。
但你得注意,rsync -avz在千兆网络下通常跑不过scp,因为压缩算法和校验计算消耗了CPU,想跑满带宽,要用rsync -aP --no-compress --no-whole-file,关闭压缩和差异计算,让它变成纯流式传输。
四套提速方案与实操命令
多线程rsync(最快最稳)
用split配合rsync手动并行,或者直接上fpsync,fpsync会扫描目录,自动分片,然后开多个rsync进程同时传,典型用法是:
fpsync -n 8 -v /data/source/ user@target:/data/dest/
-n 8代表开8个并发进程。在万兆内网环境下,fpsync能把吞吐量从单线程的400MB/s拉到900MB/s以上,接近物理极限。
tar管道流式传输
适合海量小文件场景,思路是本地实时打包,不落盘直接推给远端解包。
tar cf - /data/source/ | ssh user@target "tar xf - -C /data/dest/"
这个方案的关键优势是绕过了每个文件的SSH握手开销。实测在同样条件下,这种方式传10万个小文件比scp -r快接近一倍。
Python的SimpleHTTPServer配合wget
当目标机不方便装rsync时,可以用HTTP协议,在源机器目录里起一个临时HTTP服务:
python3 -m http.server 8080 --bind 0.0.0.0
然后在目标机上用wget的递归模式配合多线程:
wget -r -np -nH --cut-dirs=3 -P /data/dest/ http://源IP:8080/data/source/
HTTP协议本身没有加密开销,配合wget的多线程(通过--progress=dot:mega观察连接数),往往比scp快不少,注意这个方案只适合临时救急,不适合传输敏感数据。
跨城市甚至跨国传输的最优解
海量数据优先走顺丰硬盘
当数据量超过1TB,且源和目标分布在两个城市,比如上海数据中心和北京机房之间,网络传输受限于公网带宽,即使专线也要跑很久,这时行业内通行的做法是物理搬运。
拿一块企业级硬盘,dd全盘镜像或者直接rsync到本地,然后通过顺丰特快寄过去。从上海到北京,顺丰次日达,算上打包和拆包时间,整体耗时不超过30小时,而用10Mbps的专线传1TB数据,需要超过9天,这是服务器数据迁移服务价格相差悬殊的核心原因:网络传输贵在时间,快递硬盘贵在人力。
冷备归档数据用对象存储中转
如果源服务器和目标服务器都开通了云厂商的对象存储服务,可以先把数据传到OSS或S3,再用内网拉取,云厂商的同地域内网传输不占用公网带宽,而且上传和下载都能跑满服务器的下行带宽。但跨云厂商之间的对象存储转发会产生流量费用,需先计算成本再做决定。
拷资料过程中的避坑指南
少走弯路,避开这些常态陷阱
- 防火墙的conntrack表溢出,高并发连接会让Linux内核丢包,表现为速度从高点突然掉到零,过几秒又恢复,建议临时调整
net.netfilter.nf_conntrack_max或者用iptables -t raw -I PREROUTING -p tcp --dport 22 -j NOTRACK绕过状态追踪。 - 带宽协商错误,多数网卡支持自协商,但部分交换机固件有bug,会协商成千兆半双工,用
ethtool eth0确认Speed和Duplex状态。 - 磁盘先撑不住,尤其在目标机是机械硬盘阵列时,写入速度腰斩是常态。如果目标机是SSD,建议关闭文件系统日志(ext4的
data=writeback挂载选项)来降低写入放大。
临时拷贝工具怎么选
普通Linux服务器间传输选哪款
- 最快速度:fpsync或grsync(并行rsync封装)。
- 最小依赖:scp,所有Linux发行版自带。
- 双向同步:unison,适合两边都会改文件的场景。
- 跨平台:用SMB协议挂载后直接cp,但性能和稳定性不如原生SSH通道。
需要多少时间算正常
参考基准而非绝对数值
| 环境 | 单线程scp | 多线程rsync/fpsync |
|---|---|---|
| 千兆内网 | 70MB/s | 110MB/s(接近线速) |
| 万兆内网 | 120MB/s | 850MB/s |
| 跨省专线(50Mbps) | 5MB/s | 5MB/s(带宽受限) |
如果数据量小于100GB,且只有千兆内网,花时间搭环境不如直接scp,大多数瓶颈被网络带宽锁死,多线程的收益有限。
常见问题
服务器互传文件用什么命令最快?
在同等带宽条件下,使用fpsync -n 并发数进行多线程rsync传输是最快且最稳定的方式,该命令会自行分片并同时启动多个rsync进程,充分利用服务器的多核CPU和多队列网卡,如果目标机器无法安装fpsync,用tar cf - 目录 \| ssh 目标IP "tar xf - -C 目标目录"也能获得远优于scp的速度。
云服务器数据迁移要多久?
迁移耗时取决于数据量、带宽和文件数量三者的综合作用,以100GB数据为例,走内网迁移通常需要大约15到30分钟,走公网且按5Mbps带宽计算则要接近两天,如果数据量达到TB级别,业内更倾向用镜像迁移工具或物理快递硬盘来替代网络传输,速度更快且总体成本更低。
rsync传大文件和scp哪个更适合?
rsync更适合传输大文件,因为支持断点续传和增量同步,即使中途网络中断,重新执行同一命令就能跳过已传部分,scp一旦断开就得从头传起,但要注意,rsync的-z压缩参数会消耗CPU并拖慢千兆以上带宽的传输速度,传输大文件时应该去掉-z,改用--no-compress --no-whole-file参数来跑满带宽。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/925150.html


评论列表(5条)
这篇文章的内容非常有价值,我从中学习到了很多新的知识和观点。作者的写作风格简洁明了,却又不失深度,让人读起来很舒服。特别是配合部分,给了我很多新的思路。感谢分享这么好的内容!
@草草4484:这篇文章的内容非常有价值,我从中学习到了很多新的知识和观点。作者的写作风格简洁明了,却又不失深度,让人读起来很舒服。特别是配合部分,给了我很多新的思路。感谢分享这么好的内容!
读了这篇文章,我深有感触。作者对配合的理解非常深刻,论述也很有逻辑性。内容既有理论深度,又有实践指导意义,确实是一篇值得细细品味的好文章。希望作者能继续创作更多优秀的作品!
这篇文章写得非常好,内容丰富,观点清晰,让我受益匪浅。特别是关于配合的部分,分析得很到位,给了我很多新的启发和思考。感谢作者的精心创作和分享,期待看到更多这样高质量的内容!
这篇文章的内容非常有价值,我从中学习到了很多新的知识和观点。作者的写作风格简洁明了,却又不失深度,让人读起来很舒服。特别是配合部分,给了我很多新的思路。感谢分享这么好的内容!