温馨提示×

为什么linux sftp很慢

小樊
41
2026-10-25 13:26:42
栏目: 智能运维

Linux 下 SFTP 很慢 是一个比较常见的问题,通常不是“SFTP 协议本身慢”,而是由网络、加密、磁盘、配置或客户端行为等原因导致的。下面按常见原因从高概率到低概率给你梳理一下,并给出排查和解决办法。


一、网络问题(最常见)

1. 高延迟 / 跨地域传输

SFTP 基于 SSH,每一批数据都需要确认,延迟越高越慢。

  • 国内 → 国外服务器
  • 云服务器跨区
  • 4G / 弱网环境

✅ 表现:

  • 单连接速度远低于带宽
  • ping 延迟高(>50ms 就明显)

✅ 解决:

  • 使用 并行传输工具(见后面)
  • 或改用支持多线程的协议(如 rsync over ssh、对象存储)

二、加密算法太重(非常常见)

2. 使用了慢的 Cipher / MAC

老版本 OpenSSH 默认可能使用:

  • aes256-cbc
  • hmac-sha1
  • 软件加密(无 AES-NI)

✅ 表现:

  • CPU 占用高
  • 吞吐量上不去

✅ 检查:

sftp -v user@host

✅ 解决(服务端 / 客户端):

# 推荐
Ciphers aes128-gcm@openssh.com,aes256-gcm@openssh.com
MACs hmac-sha2-256-etm@openssh.com

并确保 CPU 支持 AES-NI:

grep aes /proc/cpuinfo

三、磁盘 IO 瓶颈

3. 磁盘写入慢

SFTP 写文件是同步写,如果:

  • 机械硬盘
  • 云盘 IO 被限速
  • 服务器负载高

✅ 表现:

  • iostat 中 %util 很高
  • 本地 dd 写也很慢

✅ 解决:

  • 先传到 /tmp 或内存盘
  • 换 SSD / 云盘升级

四、SFTP 子系统配置问题

4. 使用了 internal-sftp 但限制太多

例如:

ForceCommand internal-sftp

配合:

  • chroot
  • 权限检查
  • SELinux

可能导致每次操作都做大量 stat / permission 检查。

✅ 解决:

  • 减少目录层级
  • 避免超大目录(几万文件)

五、客户端行为问题

5. 小文件特别慢(非常典型)

SFTP 每个文件都有握手开销。

✅ 表现:

  • 传 1 万个小文件极慢
  • 单个大文件反而快

✅ 解决:

tar czf - dir | ssh user@host "tar xzf -"

或:

rsync -avz dir/ user@host:/path/

六、SSH / SFTP 版本问题

6. 老版本 OpenSSH

  • CentOS 6 / 老 Ubuntu
  • 不支持 GCM、ETM

✅ 解决:

  • 升级 OpenSSH
  • 或显式指定算法

七、MTU / 网卡问题(较少但存在)

  • MTU 设置错误
  • 虚拟化网卡限速
  • 丢包导致重传

✅ 检查:

ping -M do -s 1472 host

八、推荐优化组合(实战)

✅ 客户端推荐命令

sftp -o Ciphers=aes128-gcm@openssh.com \
     -o MACs=hmac-sha2-256-etm@openssh.com \
     user@host

✅ 大量文件推荐

rsync -avP --partial dir/ user@host:/data/

✅ 极速方案(不加密)

  • scp 不行(也是 SSH)
  • 用 nginx + http / oss / ftp

九、快速自检清单

你可以按顺序看:

  1. ping 延迟高不高?
  2. top 里 sshd CPU 高不高?
  3. 是大文件慢还是小文件慢?
  4. 本地磁盘写快不快?
  5. 是否跨地域?

如果你愿意,可以告诉我:

  • 服务器系统(CentOS / Ubuntu?)
  • 是否云服务器 & 地区
  • 是大文件还是小文件
  • sftp -v 的输出片段

我可以直接帮你定位到具体哪一项导致慢。

0 踩