如何提高FtpWebRequest的性能?

A9S*_*9S6 34 .net ftp ftpwebrequest

我有一个用.NET 3.5编写的应用程序,它使用FTP从服务器上传/下载文件.该应用程序工作正常,但存在性能问题:

  1. 连接FTP服务器需要花费大量时间.FTP服务器位于不同的网络上,并具有Windows 2003 Server(IIS FTP).当多个文件排队等待上传时,从一个文件到另一个文件的更改会使用FTPWebRequest创建一个新连接,并且需要花费很多时间(大约8-10秒).

  2. 有可能重新使用连接吗?我不太确定KeepAlive属性.哪些连接保持活跃并重用.

  3. Windows Server 2003上的IIS-FTP不支持SSL,因此任何人都可以通过WireShark等数据包嗅探器轻松查看用户名/密码.我发现如果IIS 7.0,Windows Server 2008在其新版本中支持基于FTP的SSL.

我基本上想要提高我的应用程序的上传/下载性能.任何想法将不胜感激.

**请注意3不是问题,但我希望人们对此发表评论

Syd*_*Syd 38

我在FtpWebRequest上做了一些实验(上传了大约20个不同大小的文件),但有以下几个因素

KeepAlive = true/false

ftpRequest.KeepAlive = isKeepAlive;
Run Code Online (Sandbox Code Playgroud)

Connnection Group Name = UserDefined或null

ftpRequest.ConnectionGroupName = "MyGroupName";
Run Code Online (Sandbox Code Playgroud)

连接限制 = 2(默认)或4或8

ftpRequest.ServicePoint.ConnectionLimit = ConnectionLimit;
Run Code Online (Sandbox Code Playgroud)

Mode = Synchronous或Async

这个例子

我的结果:

  1. 使用ConnectionGroupName,KeepAlive = true take(21188.62 msec)

  2. 使用ConnectionGroupName,KeepAlive = false花了(53449.00毫秒)

  3. 没有ConnectionGroupName,KeepAlive = false花了(40335.17毫秒)

  4. 使用ConnectionGroupName,KeepAlive = true; async = true,connections = 2花了(11576.84毫秒)

  5. 使用ConnectionGroupName,KeepAlive = true; async = true,connections = 4(10572.56毫秒)

  6. 使用ConnectionGroupName,KeepAlive = true; async = true,connections = 8花了(10598.76毫秒)

结论

  1. FtpWebRequest旨在支持内部连接池.为了确保使用连接池,我们必须确保ConnectionGroupName正在设置.

  2. 建立连接很昂贵.如果我们使用相同的凭据连接到同一个ftp服务器,将keep alive标志设置为true将最小化连接设置的数量.

  3. 如果你有很多ftp文件,推荐使用异步方法.

  4. 默认连接数为2.在我的环境中,连接限制为4将为我提供最大的整体性能增益.增加连接数可能会也可能不会提高性能.我建议您将连接限​​制作为配置参数,以便在环境中调整此参数.

希望你会发现这很有用.

  • 虽然我同意你的大部分意见,但我认为你的测试非常值得怀疑."21188.62毫秒"?你可能想说"21s"而不是.你曾经运行过一次或多次并对结果取平均值吗?得出结论,连接= 4从30ms的差异中获得最大增益是不可行的.没有违法行为,但测试本身并没有帮助,而是误导. - 如果您可以解决问题(准确性与精确度,多次运行,更多文件,背景说明等),这将是一个很棒的帖子. (4认同)
  • 我怀疑他/她在事故中键入了"21188.62毫秒".也许你想说"以秒为单位的上市时间会更容易阅读"?我不认为测试没有帮助.也许在一组有限的数据上得出结论是不明智的,但如果你想使用它,数据就在那里.至少它是一个起点. (3认同)

Rem*_*anu 18

只要您可以并行启动多个连接,单个连接是否需要很长时间才能进行连接并不重要.如果您要传输许多项目(比如数百个),那么使用BeginGetRequestStreamBeginGetResponse等异步方法并行启动数十甚至数百个WebRequest是有意义的.我处理过面临类似问题的项目(长连接/验证时间),但通过并行发出多个调用,整体吞吐量实际上非常好.

如果您使用异步方法或同步方法,只要您有多个(数十,数百)请求,它就会产生巨大的差异.这不仅适用于您的WebRequests方法,还适用于您在获取上载/下载流后使用的Stream /方法.改进的.Net性能和可伸缩性书籍有点过时,但它的大部分建议仍然存在,并且可以免费在线阅读.

需要考虑的一件事是,ServicePointManager类位于Framwework中,其唯一目的就是:破坏您的性能.确保获取 URL 的ServicePoint并将ConnectionLimit更改为合理的值(至少与您想要的并发请求数一样高).


Dav*_*vis 5

调试网络

简单网络调试的一些技巧:

  1. 从应用程序服务器ping FTP服务器时检查响应时间.
  2. 检查跟踪路由的响应时间(tracert来自DOS shell).
  3. 使用ftp命令从命令行传输文件.
  4. 通过Telnet连接到FTP服务器:telnet server 21.

结果将为解决问题提供线索.

网络硬件

对于慢速跟踪路线:

  • 确定两台计算机出现网络问题的原因.
  • 在最慢的链接之间升级网络硬件.

网络配置

对于缓慢的ping:

  • 检查每台计算机上的网络配置.
  • 确保设置最佳.

验证API

慢速命令行FTP会话将告诉您该问题未与您正在使用的FTP API隔离.它并没有将API作为一个潜在的问题来消除,但肯定会降低它的可能性.

网络错误

如果在源和目标之间丢弃数据包,ping将告诉您.您可能必须将数据包大小增加到1500字节才能看到任何错误.

FTP队列服务器

如果您无法控制目标FTP服务器,请让中间服务器接收上载的文件.然后中介以任何速度将文件发送到远程服务器.这给出了文件快速发送的错觉.但是,如果文件一上传就必须存在于远程服务器上,那么此解决方案可能不可行.

FTP服务器软件

在FTP服务器上使用不同的FTP守护程序,例如ProFTPd作为Windows服务.(ProFTPd具有允许使用SQL查询进行身份验证的各种数据库的插件.)

FTP服务器操作系统

基于Unix的操作系统可能比基于Microsoft的操作系统更好.

FTP客户端软件

有许多不同的API用于通过FTP发送和接收文件.可能需要一些工作才能使您的应用程序足够模块化,以便您只需插入新的文件传输服务即可.这里列出了一些不同的API作为答案.

替代协议

如果FTP不是绝对要求,请尝试:

  • Windows网络驱动器
  • HTTPS
  • scp,rsync或类似程序(可能需要Cygwin)


tom*_*ing 2

就我个人而言,我已经将所有应用程序不再使用 FTP 进行文件上传/下载,而是推出了基于 ASP.NET 中的 XML Web 服务的解决方案。

性能大大提高,安全性取决于您想要编码的程度(并且您可以使用 .NET 中内置的内容),并且所有这些都可以通过 SSL 顺利进行。

我们让客户的连接通过他们自己的防火墙的成功率远远高于运行 FTP。