【问题标题】:HTTPListener vs Native HTTP performanceHTTPListener 与本机 HTTP 性能
【发布时间】:2011-05-26 05:57:12
【问题描述】:

快速背景:我知道 HTTPListener 使用 http.sys 内核驱动程序,据说这使它成为一个出色的执行者。但是,当在托管的 http 服务器和本机 vc++ 服务器之间进行一些性能基准测试时,我发现本机端大约增加了 15 MB/s。测试设置是两台新格式化的 1gb nics 实验室机器。在本机方面,我看到大约 110 MB/s,这接近 100% 的 nic 减去开销,当使用 HTTPListener 时,我看到 ~94 MB/s(最大 100)。

测试是苹果对苹果,

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

总的来说,我希望我应该能够通过 HTTPListener 接近本机服务器的 110 MB/s,15 MB/s 似乎相当昂贵。

问题: 1. 是否还有其他我缺少的托管优化? 2. 有哪些潜在的瓶颈,我通过反射器查看了 HTTPResponseStream,看起来有一些编组正在进行,但没有明显的问题,事实上,当使用分块时,它会产生与我的本地服务器相同的分块数组。

感谢任何想法,

【问题讨论】:

  • 你用什么 API 构建你的 C++ 实现?
  • 托管应用程序的标准偏差较高,可能是因为垃圾收集?您是否正在创建/放弃大量对象?
  • 谁说HttpListener 类使用HTTP.SYS?? IIS 有但HttpListener 没有,事实上如果有的话会很有趣。因此,如果您认为确实如此,请提供参考。
  • 参见msdn.microsoft.com/en-us/library/ms229710.aspx - “HttpListener 类建立在 HTTP.sys 之上,HTTP.sys 是处理 Windows 的所有 HTTP 流量的内核模式侦听器。HTTP.sys 提供连接管理、带宽限制、和 Web 服务器日志记录。”
  • @Mitch Wheat,我正在重用相同的缓冲区以避免任何不必要的 GC,而且我在 32 GB 的机器上运行,因此触发 GC 的内存压力应该很小。

标签: .net performance httplistener


【解决方案1】:

它使用 Http.sys 的事实并不意味着不存在从本机到托管的转换。来自上述MSDN文章:

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

由于您正在运行托管代码这一事实,您有互操作(原生到托管,不要与 COM 互操作混淆),您有垃圾收集等。它永远不会像纯原生一样快c++ 实现。

编辑:为了使这一点更清楚,您仍在运行 .NET 进程,您只是在内核模式下连接到 IIS,而不是在用户模式下。一篇很棒的文章在这里:http://www.west-wind.com/presentations/howaspnetworks/howaspnetworks.asp

【讨论】:

    猜你喜欢
    • 2011-10-17
    • 2016-01-10
    • 2014-10-01
    • 2017-08-29
    • 2021-04-14
    • 1970-01-01
    • 2011-01-03
    • 2013-05-08
    • 2011-05-20
    相关资源
    最近更新 更多