如何加速长距离 SFTP 传输
调整 SFTP 并行请求数与缓冲区,测试压缩效果,并找出拖慢长距离安全文件传输的存储或网络限制。
同一套 SFTP 在局域网传得快、跨国却无法使用大部分带宽时,可以先检查客户端同时处理的读写请求与缓冲区。高往返时间会放大等待,但 CPU、磁盘或服务器限速也可能造成相似现象。
以下用 OpenSSH 示范如何创建基准,再分别测试请求并行度、缓冲区与压缩。每次只改一项,记录整项工作的耗时,才能判断设置是否有效;其他客户端的选项名称可能不同。
SFTP 是什么,又不是什么
SFTP 是在加密 SSH 传输层上运行文件操作的传输程序。OpenSSH 的官方 sftp 手册记载了公开密钥验证、压缩、递归拷贝、续传、请求深度与传输缓冲区。
SFTP 不是「安全版 FTP」。传统 FTP 使用一条控制连接,以及另一条发送文件内容的数据连接。RFC 959定义了这项架构,以及串流 mode 在文件结束时关闭数据连接造成的连接管理问题。SFTP 改用 SSH 的加密连接与通道流量控制。RFC 4254则定义 SSH 通道窗口与最大数据包大小,决定发送端在等待调整前能搬多少数据。
FTP 与 SFTP 都可能因距离而变慢,但设置与失败原因不同。
调校前要测量的五个上限
| 上限 | 要记录什么 | 常见信号 |
|---|---|---|
| 网络路径 | RTT、丢包、抖动、可用带宽 | 速率依路由或时段而变 |
| SFTP 请求处理流程 | 尚未完成的请求与缓冲区大小 | CPU 与磁盘都很闲,但线路利用率低 |
| 加密 CPU | 传输中的客户端与服务器 CPU | 连接尚未用满,单一核心先饱和 |
| 存储 | 来源读取、目的端写入与 IOPS | 大文件快,但创建小文件时停滞 |
| 服务器政策 | 带宽、工作阶段、请求或存储配额 | 客户端调整不再改变结果 |
至少测一个大文件与一个代表性文件夹。单一大文件能隔离串流路径,文件夹则会显示元数据、目录遍历、创建与开关档、逐档协调等成本。文件数模型请见大量小文件为什么传得慢。
如果现在用的是 SSH 上的 rsync,而不是交互式 SFTP,请改用WAN 上 rsync 过慢的调校指南;rsync 的文件清单、快速检查与差分传输决策需要不同诊断顺序。
1. 谨慎增加尚未完成的请求
OpenSSH sftp 可用 -R num_requests 或 -X nrequests=value 控制同时进行的读写请求。文档列出的默认值是 64 个请求,提高数值可能增加速度,但也会增加内存用量。
不要直接跳到极端值,应逐步测试:
sftp -R 64 user@example.com
sftp -R 128 user@example.com
sftp -R 256 user@example.com
每一轮都使用相同文件、路由、客户端与服务器。吞吐量不再上升、内存不可接受,或服务器变得不稳时就停止。更多请求不会创造带宽,只能在请求延迟是瓶颈时减少等待。
2. 测试较大的传输缓冲区
OpenSSH 文档记载 SFTP 缓冲区默认为 32 KB。-B buffer_size 或 -X buffer=value 可以变更一次读写操作使用的最大缓冲区。缓冲区越大,同一有效数据需要的往返次数越少,但会增加内存用量。
sftp -B 65536 user@example.com
sftp -B 131072 user@example.com
不存在通用的最佳值。客户端版本、服务器上限、SSH 通道窗口、内存与路径行为都会影响结果。先保留默认请求数只改缓冲区,再分开测请求深度,才能知道改善来自哪个变量。
3. 把压缩当成文件型态测试
OpenSSH 使用 -C 打开 SFTP 压缩,并把 SSH 压缩设置套到工作阶段。OpenSSH 客户端设置手册指出压缩默认关闭,且会套用到整条 SSH 连接的流量。
带宽不足且 CPU 有余裕时,纪录、原代码、CSV 或未压缩文本可能受益。JPEG、MP4、ZIP 等已压缩数据通常帮助很小,却仍会消耗 CPU。请比较:
sftp user@example.com
sftp -C user@example.com
如果压缩降低速度,或 CPU 增幅大于减少的发送字节,就保持关闭。
4. 重用工作阶段并批量处理相关工作
重复验证与创建工作阶段会增加固定成本。调度工作可用 OpenSSH 的 -b batchfile,搭配适当的非交互验证,在一条工作阶段内运行多个 SFTP 命令。
大量小文件即使留在同一工作阶段,文件系统与逐档工作仍可能占大多数时间。创建压缩档可以把文件夹转为连续串流,但会增加压缩档创建、暂存空间、解压缩与整包续传的成本。固定工作流程应比较能保留文件边界并自动批量封装的传输引擎。
5. 检查 CPU、存储与服务器限制
若请求与缓冲区没有效果,瓶颈可能不在 SFTP 处理流程。
- **CPU:**两端都要运行加密与完整性处理。记录每个核心,而不只总 CPU。
- **存储:**创建小文件可能耗尽目的端 IOPS,网络则维持低利用率。
- **网络丢包:**SSH 与 SFTP 通常跑在 TCP 上,丢包和重传会降低发送率。
- **限速:**确认 SFTP 服务器、账号、网关与上游连接没有设限。
- **额外跳跃:**跳板主机会增加一段路径,也可能成为上限。
不要为了基准数字而弱化主机密钥验证、使用过时加密或停用完整性控制。调校必须保留当初选择 SFTP 的安全特性。
可重复的 SFTP 基准测试
- 准备一个大文件与一个实际文件夹,每轮使用相同内容。
- 记录客户端与服务器版本、硬件、存储、路由、RTT、丢包和目前选项。
- 测量完整总耗时,不只看进度列峰值。
- 默认设置至少运行三次并采中位数。
- 变更请求深度、重测,保留最稳定的最佳值。
- 变更缓冲区、重测,保留最稳定的最佳值。
- 用真实文件型态比较压缩开与关。
- 中断非正式环境传输,确认续传与最终完整性。
有效数据时间下限可用1TB 传输时间计算器,路由设计与协议选择请看长距离高速文件传输指南。
何时调校 SFTP 就够,何时该比较替代方案
如果 SFTP 能达到必要完成时间、符合既有自动化,也符合安全与访问模型,就继续使用。它仍是普及且容易脚本化的选择。
比较当前版本时,使用相同文件、路径、存储设备与安全设置,分别记录传输阶段速度及取得验证后文件的完整交付时间。WarpSend 与 FTP 测试方法说明如何进行比较;FTP 结果也不能代表 SFTP 或 Aspera 的性能。
WarpSend 不会取代 SFTP 服务器需求,也没有实作 SFTP。它是给能安装受支持端点,并需要直接传输、浏览器分享链接或代管文件夹同步的团队使用的另一种流程。请先看 WarpDirect,再用 SFTP 基准的同一组文件免费测试 WarpSend。
常见问题
为什么 SFTP 在长距离连接上很慢?
常见限制包括往返延迟、丢包、保守的请求与缓冲区设置、SSH 加密的 CPU 成本,以及来源或目的端存储。高速接取线路不会消除这些上限。请用同一组文件测试,同时记录 RTT、丢包、CPU、存储吞吐量与完整耗时。
哪些 OpenSSH SFTP 设置可以改善速度?
OpenSSH 可用 -R 或 -X nrequests 控制尚未完成的请求数,用 -B 或 -X buffer控制每次请求的缓冲区。较大的值可减少高延迟路径上的等待,但会使用更多内存;若瓶颈是 CPU、存储、丢包或服务器限制,则不会改善。一次只改一个设置再重测。
应该打开 SFTP 压缩吗?
请实测,不要默认一定有帮助。带宽受限而数据是可压缩文本时可能有效,但压缩会消耗 CPU,对 JPEG、MP4、ZIP 等已压缩格式通常帮助很小。OpenSSH 默认关闭压缩。
SFTP 和 FTPS 一样吗?
不一样。SFTP 在加密的 SSH 传输层上运行文件操作;FTPS 是受 TLS 保护的 FTP,仍保留 FTP 的控制与数据连接架构。两者的客户端、连接端口、验证、防火墙行为与性能调整都不同。