代码之家  ›  专栏  ›  技术社区  ›  anelson

如何最大化http.sys系统文件上载性能

  •  15
  • anelson  · 技术社区  · 15 年前

    我正在构建一个工具,用于将非常大的流数据集(可能在单个流中的数量级为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左右。

    2 回复  |  直到 15 年前
        1
  •  2
  •   spender    15 年前

    除了这个,我看不出有多少兴趣 Tech Note . 也许值得一试 MaxBytesPerSend

        2
  •  0
  •   Andreas    15 年前

    如果你打算通过局域网发送文件,那么UDP就是一种方式,因为在这种情况下TCP的开销是一种浪费。TCP提供速率 限制 为了避免太多丢失的数据包,而使用UDP时,应用程序必须自己进行分类。NFS可以完成这项工作,如果不是你被windows困住的话;但是我确信一定有现成的UDP东西。还可以使用工具“iperf”(在linux上提供,也可能在windows上提供)对网络链接进行基准测试,而不考虑协议。有些网卡是垃圾,太依赖CPU,这会限制你的速度到200兆。你想要一个有自己处理器的网卡(不知道确切的术语)。