gpt4 book ai didi

RestSharp:底层连接已关闭:服务器关闭了预期保持事件状态的连接

转载 作者:行者123 更新时间:2023-12-03 23:17:31 25 4
gpt4 key购买 nike

我使用 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);
}
}
});

在发送过多请求时,我们会观察到服务会在一段时间后溢出一些错误 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。

除此之外,我还试图更好地了解如何进一步调查服务器断开这些连接的实际问题?这仅仅是客户端发出的连接数超过服务器可以处理的数量的问题吗? (因为它跟不上它的响应速度)

最佳答案

经过额外的调查和修改测试客户端代码后,我想我已经了解了正在发生的事情。

通过向服务器打开的 HTTP/TCP 连接数添加一个监控计数,可以观察到 RestSharp 将 HTTP 连接保持在保持事件状态,并将它们重用于后续请求。对于可持续的请求率和吞吐量,没有问题; RestSharp 可以重用特定的连接池并使它们永久保持事件状态。

但是对于服务器有时可能无法满足的速率,由于先前的 HTTP 请求尚未完成,客户端必须打开更多连接;导致打开连接的跳跃。稍后,如果它最终重新使用它认为服务器仍在尊重的保留 HTTP 连接,它最终会得到“服务器关闭了预期保持事件状态的连接”。信息。

关于RestSharp:底层连接已关闭:服务器关闭了预期保持事件状态的连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21447459/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com