繁体   English   中英

扩展多个HttpWebRequests?

[英]Scaling up Multiple HttpWebRequests?

我正在构建一个服务器应用程序,需要持续向其他几台服务器执行大量的http请求。 目前,我基本上设置了大约30个线程,并在每个线程上同步连续运行HttpWebRequests,实现了每秒约30个请求的吞吐量。

我确实在app.config中设置了ServicePoint ConnectionLimit,这不是限制因素。

我需要大幅度扩大规模。 至少我需要更多的CPU马力,但我想知道我是否会通过使用HttpWebRequest对象的异步方法(例如:.BeginGetResponse())获得任何优势,而不是自己创建线程并使用这些线程上的同步方法(例如:.GetResponse())。

如果我使用异步方法,我显然必须重新设计我的应用程序,所以我想知道是否有人可能有一些见解我去之前重新编码一切,以防我出去吃午饭。

谢谢!

如果您使用的是Windows NT,则System.Net.Sockets.Socket类始终使用IO完成端口进行异步操作。 异步模式下的HTTPWebRequest使用异步套接字,因此将使用IOCP。

如果没有进行详细的基准测试,很难说我们的瓶颈是在HttpWebRequest中,还是在堆栈中,应用程序中,还是在远程端,在服务器中。 但是,无论如何,asyncc肯定会给你更好的性能,因为它最终将使用IOCP。 重新实现应用程序的异步并不困难。

所以,我建议您先将应用程序架构更改为异步。 然后看看你获得了多少最大吞吐量。 然后,您可以开始基准测试并找出瓶颈所在的位置,并将其删除。

到目前为止,对我来说最快的结果是使用75个运行同步httpwebrequest的线程。 在Windows 2003服务器,4核3ghz,100mb连接上每秒约140个请求。

异步Httprequest / winsock陷入了大约30-50 req / sec。 没有测试同步winsock,但我想它会给你与httpwebrequest相同的结果。

测试反对1 200 000个博客供稿。

上个月一直在苦苦挣扎,所以知道是否有人设法从.net中挤出更多内容会很有趣吗?

编辑

新测试:使用xfserver iocp组件获得350req / sec。 在任何更大的结果之前使用一堆线程,每个线程都有一个实例。 lib的“客户端部分”有一些非常烦人的错误,使得实现比“服务器部分”更难实现。 不是你要求的,不是推荐的,而是一些步骤。

下一个:前winsock测试没有使用3.5 SocketAsyncEventArgs,这将是下一个。

回答

你问题的答案,不值得努力。 异步HttpWebRequest方法卸载主线程,同时在后台保持下载,但它不会提高请求的数量/可伸缩性。 (至少不是3.5,4.0可能会有所不同?)

但是,可能值得关注的是围绕异步套接字/ SocketAsyncEventArgs构建自己的包装器,其中iocp可以工作,并且可能实现类似于HttpWebRequest的开始/结束模式(在当前代码中最简单的实现)。 改善真的很大。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM