You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PySFTP本地服务器至远程服务器传输突发变慢排查求助

问题排查建议

结合你提供的信息,问题仅出现在本地服务器通过pysftp连接远程服务器的场景,以下是针对性的排查方向:

1. 核对依赖版本差异

本地服务器和你的PC上的pysftp、paramiko(pysftp底层依赖库)版本可能不一致。检查本地服务器近期是否自动更新过依赖包:

  • 执行命令对比版本:pip show pysftp paramiko
  • 如果本地服务器版本有更新,尝试回退到脚本正常运行时的版本测试。

2. 调整SFTP连接底层参数

pysftp基于paramiko,连接参数的默认值或本地服务器的TCP配置可能影响传输效率:

  • 创建Connection时显式设置缓冲区大小,比如:
    with pysftp.Connection(HOSTNAME, username=USERNAME, password=PASSWORD, port=PORT, cnopts=cnopts, buffered_size=65536) as sftp:
    
  • 检查本地服务器TCP参数,比如net.ipv4.tcp_window_scaling、net.ipv4.tcp_sack是否被修改,这类参数会直接影响SSH/SFTP的传输性能。

3. 优化目录遍历的冗余请求

你的walk_remote_dirs函数中,每个目录项都单独调用sftp.stat(),会产生大量独立SFTP请求,网络延迟增加时累积耗时会被放大:

  • 改用sftp.listdir_attr()替代sftp.listdir()+sftp.stat(),一次性获取目录下所有文件的属性,减少请求次数:
    def walk_remote_dirs(sftp, remotepath, dcallback, recurse=True):
        try:
            entries = sftp.listdir_attr(remotepath)
        except IOError as e:
            logger.error("Exception: {0}".format(e))
            if e.errno != errno.EACCES:
                raise
            else:
                entries = []
    
        for entry in entries:
            pathname = posixpath.join(remotepath, entry.filename)
            if stat.S_ISDIR(entry.st_mode):
                dcallback(pathname)
                if recurse:
                    walk_remote_dirs(sftp, pathname, dcallback)
        
        return remote_dir_names
    
  • 日志显示目录遍历耗时从约1分钟增至约2分钟,减少SFTP请求次数能直接降低这部分耗时。

4. 优化文件下载的操作逻辑

从日志看,单个文件下载耗时从4秒增至68秒,且sftp.get()内部触发了两次stat请求:

  • 如果不需要保留文件修改时间,将preserve_mtime设为False,减少一次stat请求;
  • 你的download_file函数中,remotepath变量做了冗余拼接(因为已经cd到对应目录),可直接使用相对路径;
  • 尝试用sftp.getfo()直接写入文件对象,减少本地文件操作的潜在耗时:
    def download_file(directory: str, filename:str, sftp:pysftp.Connection):
        localpath = DATA_PATH + directory[2:len(directory)]+"/"+filename
        with open(localpath, 'wb') as f:
            sftp.getfo(filename, f, preserve_mtime=True)
    

5. 排查本地服务器的网络链路变化

虽然直接SFTP连接正常,但脚本的网络路径可能存在差异:

  • 在本地服务器ping远程服务器,检查延迟是否异常增加;
  • 尝试用远程服务器的IP地址替代域名建立连接,排除DNS解析延迟;
  • 检查本地服务器到远程服务器的路由是否变更,比如是否走了更远的链路。

6. 确认远程服务器的IP限制策略

远程服务器可能针对本地服务器IP调整了SFTP限速策略:

  • 联系远程服务器管理员,确认是否有针对该IP的带宽或连接频率限制;
  • 在本地服务器用scp命令传输相同文件,若scp也慢,说明是服务器端或网络层面的限制。

内容的提问来源于stack exchange,提问作者Nab

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 21:40:35