【网络】服务器间FTP传输文件被限速问题的排查(未达最优解)

问题描述

具体问题

Linux使用FTP下载Windows上的文件,FTP传输被明显限速。

软硬件环境

  1. 两台服务器之间需要大文件传输(对比以往的业务,我们将5GB以上的文件称为大文件)。
  2. 服务端为Windows 7操作系统,客户端为银河麒麟v10(视作Linux操作系统)。
  3. 万兆网口和千兆网口。

文件传输方式的2种策略

  1. FTP服务客户端连接传输。
  2. Windows开放一个共享路径由Linux挂载(mount命令)后直接拷贝。

FTP相关信息

在Windows服务器上,FTP服务使用FileZilla Server作为FTP服务。
在麒麟服务器上,用于FTP连接客户端有2个方案:FileZilla提供的图形化客户端、博主自己使用Java开发的客户端。

问题表现

  1. 在麒麟服务器上挂载了一个Windows服务器共享的远程位置,需要使用直接拷贝到指定位置,此时在Windows服务器的任务管理器测得的带宽利用率可达99.6%,5GB文件传输,10秒以内完成。
  2. 麒麟服务器使用FileZilla客户端连接Windows服务器的FileZillaServer,传输文件,带宽利用率仅有30%,5GB文件传输多次测得时间,平均值为30秒。
  3. 麒麟服务器使用Java自研的FTP客户端连接Windows服务器的FileZillaServer,传输文件,带宽利用率有所改善,最快可达60%,5GB文件传输多次测得时间,平均值为15秒。
    下图为某一次测试的带宽占用率对比图:
    在这里插入图片描述

问题解决

  1. FileZilla客户端不满足性能指标,不使用此方案。
  2. Java自研的FTP客户端虽然没有达到挂载那么高的速度,但满足性能指标,在更换多台服务器测试、优化稳定后,最终采用此方案。

结论

可能是操作系统对于FileZilla软件进行了特殊限制,也可能是FileZilla客户端底层的某些操作导致了操作系统的这种限制存在。

发散探讨——基于此问题进行发散研究相关知识

这个问题虽然解决了,但仅是业务意义上的解决,而不是技术上的解决。若本着效率至上的“技术服务于业务”原则,确实不该继续深究,但站在个人兴趣角度,这个问题值得继续扩展探讨下去。

从FileZilla软件入手

基于软件问题入手排查,博主找到这篇文章:Ftp传输在win10下被系统限速的问题分析和解决
文中提及,Windows可能对FileZilla软件做出特殊优化性质的限制,实验中使用先传输小文件,再传输大文件的方式,“骗”过了操作系统,进而得以不被限制。这种方法是不可取的,不具有普适性,文中也说到此方法的弊端,所以不采用此方法。而后,文中提到了将FileZilla客户端的连接模式改为主动模式,会有改变,博主多次测试后,发现FTP传输带宽利用率确实有5%的提高。但仍然是和挂载方式速度相去甚远。

从Windows入手

在网络中找到的相关文章——Win10 环境FileZilla client客户端出现兼容性限速问题的解决
文中表示在FTP传输文件确实是被限速了,需要对Qos参数进行优化,即在Windows上运行以下命令:
netsh int tcp set global autotuninglevel=restrictednetsh interface tcp set heuristics disabled
即对接收窗口自动调节级别做出更改,但我在尝试后并未解决。(博主试过将FileZilla客户端设置为主动模式的同时,也执行这两个命令,再进行多次测试,结果仍然是没有提升)
在继续查询资料的时候,在微软社区发现如下提问:为什么win10/11会对smb和ftp的局域网分享传输速度限制?(这个提问和回答均值得一看,提问者是有水平的)
在这里插入图片描述
虽然我的问题来自于Windows 7,但考虑其他可能性,我还是阅读了这篇“提问者和回答者的交锋”。
此回答中,也尝试过我们上面的接收窗口自动调节级别命令的方式来优化问题,甚至重新安装了操作系统,但可惜最后问题未能解决。

从Linux入手

接下来博主准备从Linux系统的方向上寻求解决方案,便找到这篇文章:掌握Linux TCP 窗口设置,提高网络传输效率 (linux tcp 窗口设置)。文中提及的对TCP窗口大小进行修改,我新增了如下net.ipv4.tcp_window_scaling=1net.ipv4.tcp_moderate_rcvbuf=1配置后,FTP传输带宽利用率有约5%的提升,但后续无论如何调试修改参数,均无法改变带宽利用率,甚至有所降低。

既然问题无法通过配置的方式解决,那么就需要考虑到协议层面的规则。

从协议入手

Windows和Linux的文件共享,分别是使用什么协议?

这个问题其实应该是“Windows的共享文件夹、Linux的挂载远程网络位置,分别使用的是什么协议?

Windows操作系统上,共享文件夹通常使用的是SMB (Server Message
Block)协议。SMB是一种广泛应用的网络文件共享协议,尤其在Windows环境中,它允许网络上的客户端访问服务器提供的文件系统资源,如文件、目录、打印机等。现代版本的Windows系统默认使用的是SMBv2或更高版本。

Linux操作系统上,挂载远程网络位置(尤其是来自其他Linux服务器或NAS设备)最常使用的协议是NFS(Network File
System)。NFS是一种专门设计用于跨网络共享文件系统的标准协议,它允许一个系统通过网络像访问本地文件一样透明地访问远程服务器上的文件。NFS在Linux和其他类UNIX系统中广泛支持。

但我们的问题中,即使用了Windows,也使用了Linux。那么此时问题就变成了“如果Linux上挂载的网络位置是Windows上的共享文件夹,那么此时使用的什么协议?

答案是:SMB协议。因为Linux虽然有自己的NFS协议进行文件共享,但若对方是来自Windows的共享,Linux需要借助SMB客户端软件来与Windows系统进行通信。

在Linux中,通常会使用名为“cifs-utils”的软件包来提供对SMB协议的支持。

至此,由于时间限制,未能达到最优的解决方案。不过发散的学习到了很多其他知识,希望本文的观点和搜索的资料,可以提供一些解决问题的思路,以便诸位在解决相似问题的时候可以得到启发。

  • 18
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Linux网络编程下实现的FTP服务器项目是一个包含客户端和服务端的项目,主要用于实现客户端对服务器上的文件进行展示、显示路径、删除、上传、下载等功能,同时也可以对客户端本身文件进行展示、显示路径、删除文件等功能。通过该项目,用户可以利用FTP协议在Linux环境下进行文件传输操作。 为了实现FTP服务器文件传输功能,可以参考以下步骤: 1. 首先,需要编写FTP服务器的代码。可以使用C语言编写,基于Linux网络编程相关的API和库函数,如socket、bind、listen、accept等。编写的服务器代码可以实现文件的上传和下载功能。 2. 在服务器代码中,需要处理客户端的连接请求,并建立与客户端之的数据通信。可以使用socket函数创建服务器套接字,并使用bind函数将服务器套接字绑定到指定的IP地址和端口号。使用listen函数监听客户端连接请求,并使用accept函数接受客户端的连接请求,建立与客户端之的通信。 3. 一旦与客户端建立连接,服务器可以接收客户端发送的命令,并根据命令执行相应的操作。例如,当客户端发送上传文件的命令时,服务器可以接收客户端发送的文件数据,并保存到服务器的指定目录下。类似地,当客户端发送下载文件的命令时,服务器可以读取服务器上的指定文件,并将文件数据发送给客户端。 4. 在客户端代码中,用户可以通过命令行或者图形界面与服务器进行交互。用户可以输入相应的命令来上传文件服务器,或者从服务器下载文件到本地。客户端可以使用Linux系统提供的FTP客户端工具,或者自己编写FTP客户端代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

君去何方

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值