我有一个在Kestrel(Ubuntu)下运行的ASP.NET核心Web API,我遇到了一个奇怪的情况:当我运行前20个API调用的系列时,前3-5个调用相当慢,然后响应时间还可以。然后我做了一个短暂的延迟(可能是一分钟甚至更短),并再次运行一系列API调用,并且前几个调用相当慢,只有在前3-5个调用之后,响应时间才变得正常。
最初,我认为问题出在Kestrel配置中,所以我进行了以下设置:
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();
}它帮助我让我的服务更快地工作,但这个问题仍然存在。
该服务的基本逻辑如下: 1)获取请求对象2)将其解析到POCO类的实例中3)调用具有多个选择的DB以获取所有需要的数据(为此,我使用Dapper和允许一次运行多个SQL查询的方法) 4)使用新接收的数据更新对象的实例,并将对象插入到DB中
就这样。
我不知道是什么原因造成了这种延迟(空闲时间)。
我有一个猜测,也许我应该有一些虚拟调用来保持服务的运行。因此,我添加了一个包含计时器作业的Singleton,用于每分钟查询数据库中的一些查找数据。但这并没有帮助。
然后,我尝试添加另一个计时器作业来查询步骤N3中所需的数据,只查询数据库中的第一条记录,没有一些特定的请求参数,但它没有帮助,而且它开始工作得更慢。
我还在表上添加了索引,以使SELECTs更快地工作,另外,我向所有SELECTs添加了WITH(NOLOCK)语句,但它没有帮助。
有什么想法吗,伙计们?
发布于 2018-08-01 15:51:53
当查询执行获取时间而不是期望时,则其抛出超时异常。我们可以通过设置commandtimeout=0来解决它。当我们设置commandtimeout=0时,它将在完成执行后响应。
发布于 2018-08-01 15:47:17
我还在想,也许它是关于连接字符串的,如下所示:
Data Source=mydbserver;Initial Catalog=db1;Persist Info=True;User Data Source=mydbserver;Initial Catalog=db1;Persist Info=True;User最大池Size=200;Pooling=true;Connection Timeout=30;Connection Lifetime=0;Min池Size=0;
https://stackoverflow.com/questions/51612152
复制相似问题