【发布时间】: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