ice*_*ava 5 keep-alive throughput restsharp
我使用 RestSharp 作为底层 HTTP 客户端库,在黑盒服务上制作压力/吞吐量测试客户端。线程池和服务点连接限制已提高到 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);
}
}
});
Run Code Online (Sandbox Code Playgroud)
在发送过多请求时,我们会观察到服务会在一段时间后溢出一些错误 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)
Run Code Online (Sandbox Code Playgroud)
或者
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)
Run Code Online (Sandbox Code Playgroud)
这似乎表明 RestSharp 正在使用 HTTP keep-alive 进行连接。有没有办法控制这种行为?我似乎无法找到任何设置来指示 RestSharp不使用 keep-alive。
除此之外,我还试图更好地了解如何进一步调查服务器断开这些连接的实际问题?这仅仅是客户端发出的连接数超过服务器可以处理的数量的问题吗?(因为它跟不上它的响应速度)
经过额外的调查和修改测试客户端代码后,我想我已经对正在发生的事情有了一些了解。
通过向服务器打开的 HTTP/TCP 连接数添加监控计数,可以观察到 RestSharp 将 HTTP 连接保持在 keep-alive 状态,并在后续请求中重用它们。对于可持续的请求率和吞吐量来说,没有问题;RestSharp 可以重用某个连接池并让它们永远保持活动状态。
但对于服务器有时可能无法满足的速率,客户端必须打开更多连接,因为之前的 HTTP 请求尚未完成;导致开放连接的跳跃。稍后,如果它最终重用了它认为服务器仍在遵守的保留 HTTP 连接,则最终会出现“预期保持活动状态的连接已被服务器关闭”的结果。信息。
| 归档时间: |
|
| 查看次数: |
8531 次 |
| 最近记录: |