扩展多个 HttpWebRequest?
Posted
技术标签:
【中文标题】扩展多个 HttpWebRequest?【英文标题】:Scaling up Multiple HttpWebRequests? 【发布时间】:2011-03-15 01:00:57 【问题描述】:我正在构建一个服务器应用程序,该应用程序需要持续向其他几个服务器执行大量 http 请求。目前,我基本上设置了30个左右的线程,并在每个线程上持续同步运行HttpWebRequests,达到每秒30个请求左右的吞吐量。
我确实在 app.config 中设置了 ServicePoint ConnectionLimit,所以这不是限制因素。
我需要大幅扩大规模。至少我需要更多的 CPU 马力,但我想知道我是否会通过使用 HttpWebRequest 对象的异步方法(例如: .BeginGetResponse() )而不是自己创建线程并使用这些线程上的同步方法(例如: .GetResponse() )。
如果我使用异步方法,我显然必须重新设计我的应用程序,所以我想知道在我去重新编码所有内容之前是否有人可能会有一些见解,以防我出去吃午饭。
谢谢!
【问题讨论】:
【参考方案1】:如果您在 Windows NT 上,则 System.Net.Sockets.Socket 类始终使用 IO 完成端口进行异步操作。而异步模式下的 HTTPWebRequest 使用异步套接字,因此将使用 IOCP。
如果不进行详细的基准测试,很难说我们的瓶颈是在 HttpWebRequest 内部,还是在堆栈上,在您的应用程序中,还是在远程端,在服务器中。但是,可以肯定的是,asyncc 会给你更好的性能,因为它最终会在幕后使用 IOCP。并且为异步重新实现应用程序并不是那么困难。
因此,我建议您首先将应用架构更改为异步。然后看看你得到了多少最大吞吐量。然后,您可以开始进行基准测试并找出瓶颈所在,然后消除它。
【讨论】:
【参考方案2】:到目前为止,对我来说最快的结果是使用 75 个线程运行同步 httpwebrequest。 在 Windows 2003 服务器、4core 3ghz、100mb 连接上每秒大约 140 个请求。
异步 Httprequest / winsock 卡在大约 30-50 req/sec。没有测试同步 winsock,但我想它会给你与 httpwebrequest 相同的结果。
测试针对 120 万个博客供稿。
上个月一直在努力解决这个问题,所以想知道是否有人设法从 .net 中榨取更多东西会很有趣?
编辑
新测试:使用 xfserver iocp 组件获得 350req/sec。在任何更大的结果之前使用一堆线程,每个实例都有一个实例。 lib 的“客户端部分”有几个非常烦人的错误,使得实现比“服务器部分”更难。不是您要求的,也不是推荐的,而是某种步骤。
下一个:之前的winsock测试没有使用3.5 SocketAsyncEventArgs,下一个。
回答
您的问题的答案,不,不值得努力。 异步 HttpWebRequest 方法在后台保持下载的同时卸载主线程,它不会提高请求的数量/可扩展性。 (至少在 3.5 中不会,在 4.0 中可能会有所不同?)
但是,可能值得关注的是围绕 iocp 工作的异步套接字/SocketAsyncEventArgs 构建自己的包装器,并且可能实现类似于 HttpWebRequest 的开始/结束模式(在当前代码中最容易实现)。进步真的很大。
【讨论】:
我的印象是 Async HttpWebRequests 应该使用 IO Completion 端口,我认为这与默认的 ThreadPool 不同...我现在有点困惑,因为我本以为会这样比一堆线程上的同步 webreqeusts 更快... 是的,应该,但到目前为止,我还没有看到任何同时请求超过 50 个的有效客户端示例。在我的情况下,我解析第一个字节以检查它是否实际上是一个 xml 提要,我猜任何解析/结果仍然会在池工作线程上完成。我可能是错的,但我的猜测是 .net 异步请求主要针对后台下载而不阻塞 gui 应用程序中的 ui 线程 - 不要运行尽可能多的同时请求。以上是关于扩展多个 HttpWebRequest?的主要内容,如果未能解决你的问题,请参考以下文章
HttpWebRequest发送post请求时有多个参数如何处理
如何从 Silverlight 中的 HttpWebRequest.BeginGetRequestStream 更新我的 UI