我使用RestSharp作为底层HTTP客户端库,在黑盒服务上创建压力/吞吐量测试客户端。 Threadpool和Servicepoint连接限制已经提升到5000,但这不应该太担心,因为我们每秒测试大约500-1000个请求。高分辨率(微秒)定时器组件用于以我们想要测试的速率抛出请求。
RestSharp代码大致是
restClient.ExecuteAsync(postRequest, res =>
{
stopwatch.Stop();
lock (this.countLocker)
{
this.roundTrips.Add(stopwatch.ElapsedMilliseconds);
if (res.ResponseStatus == ResponseStatus.Completed &&
(res.StatusCode == HttpStatusCode.OK ||
res.StatusCode == HttpStatusCode.NoContent))
{
this.responseCount++;
}
else
{
// Treat all other status codes as errors.
this.reportError(res);
}
}
});
在抽取太多请求时,我们会观察到服务会在一段时间后溢出一些错误503响应,但RestSharp将这些视为完整响应,因为这是来自服务器的有效响应;没有抛出实际的异常。
不清楚的是RestSharp因底层连接错误而遇到异常
The underlying connection was closed: A connection that was expected to be kept alive was closed by the server.
at RestSharp.Http.GetRawResponseAsync(IAsyncResult result, Action`1 callback)
at RestSharp.Http.ResponseCallback(IAsyncResult result, Action`1 callback)
或
The underlying connection was closed: An unexpected error occurred on a receive.
at RestSharp.Http.GetRawResponseAsync(IAsyncResult result, Action`1 callback)
at RestSharp.Http.ResponseCallback(IAsyncResult result, Action`1 callback)
似乎暗示RestSharp正在使用HTTP keep-alive进行连接。有没有办法控制这种行为?我似乎无法找到任何设置来指示RestSharp 不使用keep-alive。
除此之外,我还试图更好地了解如何进一步调查服务器破坏这些连接的实际问题?是否仅仅是客户端发出的累积连接比服务器可以处理的更多? (因为它无法跟上其回复率)
答案 0 :(得分:4)
经过额外调查和修改测试客户端代码后,我想我已经了解了正在发生的事情。
通过向服务器的打开HTTP / TCP连接数添加监视计数,可以观察到RestSharp将HTTP连接保持在保持活动状态,并将其重用于后续请求。对于可持续的请求率和吞吐量,没有问题; RestSharp可以重用某个连接池并使它们永久保持活着。
但是对于服务器可能不时满足的速率,客户端必须打开更多连接,因为之前的HTTP请求尚未完成;导致开放连接跳跃。稍后,如果它最终重用认为的保留HTTP连接,服务器仍在遵守,那么它将最终得到“服务器关闭了预期保持活动的连接。 “消息。
答案 1 :(得分:1)
我用这条简单的线解决了它
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;