我使用插座的自定义HTTP服务器设置,以及使用HTTPWebRequest连接到该服务器的客户端。客户端是多线程,使用此代码:
ServicePointManager.UseNagleAlgorithm = false;
ServicePointManager.Expect100Continue = false;
ServicePointManager.DefaultConnectionLimit = 48;
var request = (HttpWebRequest)WebRequest.Create(url);
request.Method = verb;
request.Timeout = timeout;
request.AutomaticDecompression = DecompressionMethods.GZip;
request.Proxy = null;
request.SendChunked = false;
/*offending lines*/
var writer = new StreamWriter(request.GetRequestStream(),Encoding.UTF8);
writer.Write(stringData);
writer.Close();
/*end offending lines*/
var response = (HttpWebResponse)request.GetResponse();
我一直在通过此代码运行数千个请求,并且大多数时候都可以正常运行。平均响应时间约为200ms,包括在服务器上完成的一些工作。
问题在于,大约0.2%的请求非常慢。测量时,我注意到慢速请求在获取和写入请求流时暂停3秒( -20ms)。GetResponse()仍然很快,服务器上的任何内容都需要额外的时间。
使用listing()和beginAccept(),将服务器实现为侦听器套接字在端口上的听力。接受连接后,在新套接字上调用了开始重新定位(来自endaccept()),然后在侦听器插座上再次调用beginAccept。从我阅读的内容来看,这就是这样做的方法。
所以我的问题是:GetRequeststream()期间会发生什么?数据实际上是在此处发送的,还是在GetResponse()上冲洗?在没有任何明显原因的情况下,某些请求如何需要3秒钟?我的服务器实现是否有缺陷?奇怪的是,它总是3秒钟,除了有时可能是9秒。出于某种原因,它似乎是3的倍数。
一些可能的情况:
- 该连接是在GetRequestStream()上启动的,并且服务器不立即接受。我该如何测试是否是这种情况?
- 在getRequeststream()上或写作的幕后发生了一些事情。
- 等待网络硬件?
- 等待DNS解决方案?
- 其他东西?
任何帮助都非常感谢。
编辑:我尝试通过Web代理进行连接,然后延迟从getRequeststream()移动到getResponse(),这表明问题确实在Web服务器中。似乎它不接受连接。我意识到endaccept()和beginAccept()之间可能会有一定的延迟,但不应等同于3秒延迟,对
我也尝试过单线线程运行我的客户端,并且问题似乎消失了。这表明连接延迟仅在同时发出多个请求时发生。
我想我有点太晚了,但是我遇到了类似的问题和发现和文章,这描述了这种问题似乎相当低的原因-http://www.percona.com/blog/2011/04/19/mysql-connection timeouts/
也许是因为您不处理请求流。尝试用以下内容替换有问题的线:
var stream = request.GetRequestStream();
var buffer = Encoding.UTF8.GetBytes(stringData);
stream.Write(buffer, 0, buffer.Length);
stream.Dispose();
初步测试表明,该问题确实是服务器上的连接拥挤。通过对插座代码进行一些重组,我设法摆脱了缓慢的连接。我今晚将进行更多测试以确保,但看起来很有希望!