我有一个在 Kestrel(Ubuntu) 下运行的 ASP.NET Core 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) 使用多个 SELECT 调用 DB 以获取所有需要的数据(为此我使用 Dapper以及允许一次性运行多个SQL查询的方法)4)使用新接收的数据更新对象的实例并将对象插入数据库
就是这样。
而且我无法弄清楚是什么导致了这种延迟(空闲时间)。
我有一个猜测,也许我应该有一些虚拟调用来保持服务运行。所以我添加了一个包含 Timer 作业的单例来每分钟查询数据库以获取一些查找数据。但它没有帮助。
然后我尝试添加另一个计时器作业来查询步骤 N3 中所需的数据,仅用于数据库中的第 1 条记录,没有一些特定的 req 参数,但它没有帮助,而且它开始工作得更慢。
我还在表上添加了索引,以使 SELECT 更快地工作,另外我向所有 SELECT 添加了 WITH(NOLOCK) 语句,但它没有帮助。
有什么想法吗,伙计们?
湖上湖
慕沐林林
相关分类