C# StackExchange.Redis在重载时未读取响应

C# StackExchange.Redis在重载时未读取响应,c#,asp.net-core,stackexchange.redis,C#,Asp.net Core,Stackexchange.redis,我们正在一个大型ASP.Net核心Web API项目中使用StackExchange.Redis库,在重载时会出现一些性能问题 尽管使用此库对Redis的读写在偶尔的请求中工作正常,但该库完全停止在服务器负载较重的情况下处理Redis响应 为了重现这个问题,我们编写了一个最小的测试服务。 这是我们在ASP.Net核心控制器类中的API方法: 命名空间WebApplication2.控制器 { [路由(“api/[控制器]”)] 公共类TestController:控制器 { 专用只读连接多路复用

我们正在一个大型ASP.Net核心Web API项目中使用StackExchange.Redis库,在重载时会出现一些性能问题

尽管使用此库对Redis的读写在偶尔的请求中工作正常,但该库完全停止在服务器负载较重的情况下处理Redis响应

为了重现这个问题,我们编写了一个最小的测试服务。 这是我们在ASP.Net核心控制器类中的API方法:

命名空间WebApplication2.控制器
{
[路由(“api/[控制器]”)]
公共类TestController:控制器
{
专用只读连接多路复用器\u客户端;
公共测试控制器(ConnectionMultiplexer客户端)
{
_客户=客户;
}
[HttpGet(“许多”)]
公共异步任务GetAsync()
{
var数据库=_client.GetDatabase();
Console.WriteLine(“--StringSetAsync”);
wait database.StringSetAsync($“testkey:{Guid.NewGuid()}”,“test”).configurewait(false);
Console.WriteLine(“--Return”);
返回Ok();
}
}
}
我们通过以下方式连接到单个Redis服务器:

var client=ConnectionMultiplexer.Connect(新配置选项{
端点={{“10.200.1.100”,6379},
AbortOnConnectFail=false,
连接超时=15000
},Console.Out);
偶尔请求期间的输出(如预期):

重载时的输出(
wrk-t8-c400-d60s——延迟http://localhost/api/test/many
):

我们使用的是1.2.4版,因为它包含在ASP.NETCore中,但我们也可以用最新的1.2.6版复制它

我们已经向图书馆报告了这个问题,但似乎没有人关心


提前感谢您的帮助

在2.0版本中的一些通信代码的主要重写过程中,此问题已得到修复。 有关更多信息,请参阅链接问题和发行说明:

1。您使用的是什么版本的StackExchange.Redis?2.这是否也在非异步版本中重现?@OrelEraki谢谢你的提示。我已经编辑了我的问题。你有没有对没有响应的过程进行内存转储并查看一下?procdump-ma pid c:\temp\NotRespondingRedis.dmp。将转储加载到Visual Studio并行堆栈中可能已经有了一些线索。不要调用
.ConfigureAwait(false)。首先,ASP.NET核心以不同的方式处理同步(与ASP.NET不同),其次,建议您只在第三个库中执行同步,因为您不确定将在哪个上下文中执行该操作
-- StringSetAsync
-- -- Return
-- StringSetAsync
-- -- Return
-- StringSetAsync
-- StringSetAsync
-- -- Return
-- -- Return
...
-- StringSetAsync
-- StringSetAsync
-- StringSetAsync
-- StringSetAsync
-- StringSetAsync
<<< Forever until we kill the request-spamming with wrk >>>
-- -- Return
-- -- Return
-- -- Return
-- -- Return
-- -- Return
[HttpGet("sync")]
public IActionResult Get()
{
    var database = _client.GetDatabase();

    Console.WriteLine("-- StringSet");
    database.StringSet($"testkey:{Guid.NewGuid()}", "test");
    Console.WriteLine("-- -- Return");

    return Ok();
}