我正在开发一个 C# 控制台应用程序,它使用 SSH 密钥对身份验证从 SFTP 服务器下载文件。
我正在使用 Chilkat API。
我尝试下载的文件非常大,介于 8GB-13GB 之间。
目前我可以使用我的应用程序获得的最大下载速度约为 570 KB/s
如果我尝试使用 FileZilla 下载相同的文件,我将获得 2.6 MB/s 的下载速度
从同一网络上的同一台计算机上运行。
有没有办法让 FileZilla 的下载速度与控制台应用程序相匹配?
我正在开发一个 C# 控制台应用程序,它使用 SSH 密钥对身份验证从 SFTP 服务器下载文件。
我正在使用 Chilkat API。
我尝试下载的文件非常大,介于 8GB-13GB 之间。
目前我可以使用我的应用程序获得的最大下载速度约为 570 KB/s
如果我尝试使用 FileZilla 下载相同的文件,我将获得 2.6 MB/s 的下载速度
从同一网络上的同一台计算机上运行。
有没有办法让 FileZilla 的下载速度与控制台应用程序相匹配?
您可能需要更大的 TCP 最大窗口大小:http: //msdn.microsoft.com/en-us/library/ms819736.aspx
控制它的.NET函数是Socket.SetSocketOption(SocketOptionName.ReceiveBuffer)
我知道这是非常古老的,但还没有人明确回答。如果您有网络性能,Chilkat 建议增加 SoRcvBuf 和 SoSndBuf 的大小。我遇到了和你一样的问题,这解决了我的问题。
公共 int SoSndBuf {get; 放; }
设置发送缓冲区大小套接字选项。通常,此属性应保持不变。默认值为 0,表示不应显式设置发送缓冲区大小套接字选项(即应使用系统默认值,可能因系统而异)。
如果上传性能看起来很慢,可以更改此属性。建议为 4096 的倍数。要查看当前系统的默认发送缓冲区大小,请在调用任何建立连接的方法后检查 LastErrorText 属性。应在“SO_SNDBUF”标题下报告。要提高性能,请尝试将其设置为默认值的 2、3 或 4 倍。
之前当我将 byffer 大小设置得太小时,我遇到了这个问题。
对于实际结果,缓冲区大小应根据文件大小而有所不同。您不想要大文件的小缓冲区(您的情况,瓶颈是您的应用程序管理缓冲区,而不是连接速度)。
您也不希望为较小的文件提供大缓冲区,这样您就不会跟踪进度。
SFTP 是安全的,这就是它下载速度较慢的原因。如果您想要类似的速度,您应该使用 FTP 下载或尝试修改服务器设置以允许非限制速度。
有几个因素会影响 SFTP 速度。SSH 缓冲区大小、SFTP 缓冲区大小、管道长度是这些因素之一(加密算法是另一个)。另一个因素是语言。优化的 C++ 代码总是比 C# 代码快。因此,虽然您可以使用 FileZilla 实现相当的速度,但您不太可能匹配它们。
您是否还检查了其他 SFTP 组件(市场上有很多)?