ane*_*son 15 .net c# performance http.sys
我正在构建一个工具,可以从一台服务器向另一台服务器传输非常大的流数据集(可能在单个流中的数量级为TB,通常为几十千兆字节).该工具的客户端部分将从源磁盘读取块,并通过网络发送它们.服务器端将从网络中读取这些块并将其写入服务器磁盘上的文件.
现在我正在尝试决定使用哪种传输方式.选项是原始TCP和HTTP.
我真的,真的希望能够使用HTTP.HttpListener(或WCF,如果我想去那条路线)可以很容易地插入HTTP Server API(http.sys),我可以免费获得身份验证和SSL之类的东西.现在的问题是表现.
我编写了一个简单的测试工具,使用BeginWrite/EndWrite异步I/O惯用法,在服务器端使用异步BeginRead/EndRead发送128K块空字节.我已经修改了这个测试工具,所以我可以通过HttpWebRequest
/ 使用HTTP PUT操作HttpListener
,或使用TcpClient
/进行普通的旧套接字写操作TcpListener
.要排除网卡或网络路径的问题,客户端和服务器都在一台计算机上并通过localhost进行通信.
在我的12核Windows 2008 R2测试服务器上,此测试工具的TCP版本可以以450MB/s的速度推送字节,并且CPU使用率最低.在同一个盒子上,测试工具的HTTP版本在130MB/s和200MB/s之间运行,具体取决于我如何调整它.
在这两种情况下,CPU使用率都很低,并且CPU使用的绝大部分是内核时间,所以我很确定我对C#和.NET运行时的使用不是瓶颈.这个盒子有两个6核Xeon X5650处理器,24GB单排DDR3内存,我自己专门用于自己的性能测试.
我已经知道HTTP客户端的调整一样ServicePointManager.MaxServicePointIdleTime
,ServicePointManager.DefaultConnectionLimit
,ServicePointManager.Expect100Continue
,和HttpWebRequest.AllowWriteStreamBuffering
.
有没有人对如何使HTTP.sys性能超过200MB/s有任何想法?有没有人看到它在任何环境下表现都很好?
更新:
下面是关于我与看到的表现更多的细节TcpListener
VS HttpListener
:
首先,我写了一个TcpClient/TcpListener测试.在我的测试盒上,能够推动450MB/s.
然后使用反射器我想出了如何获取HttpWebRequest底层的原始Socket对象,并修改了我的HTTP客户端测试以使用它.仍然没有快乐; 差不多200MB/s.
我目前的理论是http.sys针对典型的IIS用例进行了优化,这是一个很多并发的小请求,以及大量并发和可能很大的响应.我假设为了实现这种优化,MSFT必须以牺牲我正在努力实现的目标为代价,这是一个非常大的请求的非常高的吞吐量,响应非常小.
为了它的价值,我还尝试了多达32个并发HTTP PUT操作,看它是否可以扩展,但仍然没有乐趣; 大约200MB/s.
有趣的是,在我的开发工作站上,运行64位Windows 7的四核Xeon Precision T7400,我的TcpClient实现大约200MB/s,HTTP版本也大约200MB/s.一旦我将它带到运行Server 2008 R2的高端服务器级机器,TcpClient代码就会达到450MB/s,而HTTP.sys代码则保持在200左右.
在这一点上,我遗憾地得出结论,HTTP.sys不是我需要完成的工作的正确工具,并且将不得不继续使用我们一直使用的手动插槽协议.
归档时间: |
|
查看次数: |
2275 次 |
最近记录: |