我正在构建一个工具,用于将非常大的流数据集(可能在单个流中的数量级为TB;通常为数十GB)从一台服务器传输到另一台服务器。该工具的客户机部分将从源磁盘读取块,并通过网络发送它们。服务器端将从网络上读取这些块,并将它们写入服务器磁盘上的文件。
现在我正在决定使用哪种交通工具。选项是原始TCP和HTTP。
我真的,真的希望能够使用HTTP。HttpListener(或者WCF,如果我想这样做的话)可以很容易地插入HTTP服务器API(http.sys系统),我可以免费获得身份验证和SSL之类的东西。现在的问题是性能。
HttpWebRequest
HttpListener
,或使用
TcpClient
TcpListener
. 为了排除网卡或网络路径的问题,客户机和服务器都在一台机器上,并通过localhost进行通信。
在这两种情况下,CPU使用率都很低,而且绝大多数CPU使用率都是内核时间,所以我非常确定我对C#和.NET运行时的使用不是瓶颈。这个盒子有两个6核的XeonX5650处理器,24GB的单列DDR3内存,是我自己专门用来进行性能测试的。
ServicePointManager.MaxServicePointIdleTime
,
ServicePointManager.DefaultConnectionLimit
,
ServicePointManager.Expect100Continue
,和
HttpWebRequest.AllowWriteStreamBuffering
.
有人知道我该怎么做吗HTTP.sys系统性能是否超过200MB/s?有没有人见过它在任何环境下都有如此出色的表现?
:
TcpListener公司
与
:
首先,我编写了一个TcpClient/TcpListener测试。在我的测试箱上,它可以推450MB/s。
然后使用reflector,我找到了如何获取HttpWebRequest下面的原始Socket对象,并修改了我的HTTP客户机测试以使用它。仍然没有乐趣;只有200MB/s。
我目前的理论是http.sys系统针对典型的IIS用例进行了优化,即大量并发的小请求,以及大量并发的可能是大型响应。我假设,为了实现这种优化,MSFT必须以牺牲我正在努力实现的目标为代价,即在一个非常大的请求上实现非常高的吞吐量,而响应非常小。
值得一提的是,我还尝试了多达32个并发的httpput操作,看看它是否可以扩展,但仍然没有乐趣;大约200MB/s。
有趣的是,在我的开发工作站(运行64位Windows 7的四核Xeon Precision T7400)上,我的TcpClient实现大约为200MB/s,HTTP版本也大约为200MB/s。一旦我将其带到运行server 2008 R2的高端服务器类机器上,TcpClient代码将达到450MB/s,而HTTP.sys系统代码保留200左右。