HTTPListener和本地HTTP性能比较

10

快速背景: 我理解 HTTPListener 使用 http.sys 内核驱动,据说它是一个非常高效的性能执行程序。然而,在使用受管理的 HTTP 服务器和本地 VC++ 服务器进行一些性能基准测试时,我发现本地服务器的速度大约比受管理的服务器快了 15 MB/s。测试设置为两台新格式化的实验室计算机,配备 1gb 网络接口卡。在本地方面,当使用 HTTPListener 时,我看到的速度约为 94 MB/s(最大值 100),而当使用本地服务器时,则可以看到约 110 MB/s 的速度,这几乎等于网卡的 100% 减去开销。

测试是苹果对苹果的比较,

  • 都发送相同的有效负载 (~120 mb)
  • 我使用相同的托管客户端应用程序来测试两个服务器
  • 对于托管版本,我已禁用 Nagle (但测试了两种方式,结果相同)
  • 我运行一批测试并计算吞吐量,有趣的是,托管版本的标准偏差更高,即与原生版本相比结果不太一致。

总体而言,我希望通过 HTTPListener 能够接近本地服务器的 110 MB/s,15 MB/s 看起来相当昂贵。

问题: 1. 是否存在我所忽略的受管理优化? 2. 有哪些潜在瓶颈?我通过 Reflector 查看了 HTTPResponseStream,发现有一些马歇尔处理,但没有明显的问题,事实上,在使用分块时,它会生成与我的本地服务器相同的块数组。

感谢您的任何想法,


你的 C++ 实现使用了哪些 API? - Lou Franco
1
谁说HttpListener类使用HTTP.SYS?IIS使用它,但不是HttpListener,事实上如果它使用的话会很有趣。因此,请提供参考资料,如果您认为它使用了HTTP.SYS。 - Aliostad
8
HttpListener类建立在HTTP.sys之上,这是处理Windows所有HTTP流量的内核模式侦听器。HTTP.sys提供连接管理、带宽限制和Web服务器日志记录功能。请参阅http://msdn.microsoft.com/en-us/library/ms229710.aspx。 - Joe Giardino
@Mitch Wheat,我正在重复使用同一缓冲区,以避免任何不必要的GC,而且我正在运行32 GB的机器上,所以几乎没有内存压力来触发GC。 - Joe Giardino
@jrno - 你好,也许你可以在互联网上分享一些代码,因为性能/可扩展性确实取决于你具体做什么。例如,如果你在托管代码中分配了120m作为byte[],那么你肯定会遇到麻烦 :-) - Simon Mourier
显示剩余2条评论
1个回答

1

它使用Http.sys并不意味着没有本地到托管的转换。根据上述MSDN文章:

HTTP.sys提供连接管理、带宽限制和Web服务器日志记录。

由于您正在运行托管代码,因此您具有互操作性(本地到托管,不要与COM互操作混淆),垃圾回收等。它永远不会像纯本地c++实现那样快。

编辑:为了使这更清晰,您仍在运行.NET进程,只是在内核模式下而不是用户模式下钩入IIS。关于这个问题的一篇很好的文章在这里:http://www.west-wind.com/presentations/howaspnetworks/howaspnetworks.asp


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接