C# ASP.NET Core:两次调用之间的空闲超时(有延迟)
我有一个ASP.NET核心Web API在Kestrel(Ubuntu)下运行,我面临一个奇怪的情况: 当我运行前20个API调用时,前3-5个调用非常慢,然后响应时间就可以了。 然后我做了一个很短的延迟(可能是一分钟甚至更少),然后再次运行一系列API调用,并且前几次调用非常慢,只有在前3-5次调用之后,响应时间才变得正常 起初,我认为问题出在红隼的配置上,所以我做了以下设置:C# ASP.NET Core:两次调用之间的空闲超时(有延迟),c#,sql-server,asp.net-mvc,asp.net-core,kestrel,C#,Sql Server,Asp.net Mvc,Asp.net Core,Kestrel,我有一个ASP.NET核心Web API在Kestrel(Ubuntu)下运行,我面临一个奇怪的情况: 当我运行前20个API调用时,前3-5个调用非常慢,然后响应时间就可以了。 然后我做了一个很短的延迟(可能是一分钟甚至更少),然后再次运行一系列API调用,并且前几次调用非常慢,只有在前3-5次调用之后,响应时间才变得正常 起初,我认为问题出在红隼的配置上,所以我做了以下设置: var host = new WebHostBuilder() .UseKestrel(opt
var host = new WebHostBuilder()
.UseKestrel(options =>
{
options.Limits.MaxConcurrentConnections = 200;
options.Limits.MaxConcurrentUpgradedConnections = 200;
options.Limits.MaxRequestBodySize = 10000;
options.Limits.MinRequestBodyDataRate = new MinDataRate(bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10)));
options.Limits.MinResponseDataRate = new MinDataRate(bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10)));
options.Limits.KeepAliveTimeout = TimeSpan.FromDays(2);
})
.UseConfiguration(config)
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseStartup<Startup>()
.Build();
host.Run();
}
var host=new WebHostBuilder()
.UseKestrel(选项=>
{
options.Limits.MaxConcurrentConnections=200;
options.Limits.MaxConcurrentUpgradedConnections=200;
options.Limits.MaxRequestBodySize=10000;
options.Limits.MinRequestBodyDataRate=新的MindDataRate(bytesPerSecond:100,gracePeriod:TimeSpan.FromSeconds(10));
options.Limits.MinResponseDataRate=新的MinDataRate(bytesPerSecond:100,gracePeriod:TimeSpan.FromSeconds(10));
options.Limits.KeepAliveTimeout=TimeSpan.FromDays(2);
})
.UseConfiguration(配置)
.UseContentRoot(目录.GetCurrentDirectory())
.Useii整合()
.UseStartup()
.Build();
host.Run();
}
它帮助我使我的服务更快地工作,但这个问题仍然存在
服务的基本逻辑如下所示:
1) 获取请求对象
2) 将其解析为POCO类的实例
3) 使用multiple select调用数据库以获取所有必需的数据(为此,我使用Dapper和允许一次性运行多个SQL查询的方法)
4) 使用新接收的数据更新对象的实例,并将对象插入数据库
就这样
我不知道是什么原因造成了这种延迟(空闲时间)
我猜也许我应该有一些假调用来保持服务运行。因此,我添加了一个包含计时器作业的单例,以每分钟查询数据库中的一些查找数据。但它没有帮助
然后,我尝试添加另一个计时器作业来查询步骤N3中仅针对数据库中的第一条记录所需的数据,没有一些特定的req参数,而且没有任何帮助,而且,它开始工作得更慢
我还添加了表上的索引,以使选择更快地工作,此外,我还向所有选择添加了(NOLOCK)语句,但没有帮助
有什么想法吗,伙计们?我也在想可能是关于连接字符串的,这里是:
数据源=mydbserver;初始目录=db1;持久安全信息=True;用户ID=大男孩;密码=大男孩;multipleactiveresultsets=True;最大池大小=200;池=真;连接超时=30;连接寿命=0;最小池大小=0 当查询执行getting time而不是desire时,则抛出超时异常。我们可以通过设置commandtimeout=0来解决此问题。当我们设置commandtimeout=0时,它将在完成执行后响应 可能它与SQL Max Pool Size(在连接字符串中)连接?SQL Server将其读取的数据页缓存到内存中(您可以通过
设置统计IO ON
看到),这可能涉及到这一点。如果您能提供一个连接字符串,那将非常棒。我也有同样的问题。我不知道原因,但经过一段空闲时间后,请求速度变慢,下一个请求速度变快。并且该服务始终处于打开状态,并且没有数据库连接。看起来红隼是如何在内部实现的。它是在查询时设置的,而不是在建立连接时设置的。您需要在每个数据库响应中关闭连接。是的,我在进行查询之前在命令中设置了连接,是的,我在每次与数据库对话后关闭连接