我有一个在 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) 语句,但它没有帮助。有什么想法吗,伙计们?
2 回答
湖上湖
TA贡献2003条经验 获得超2个赞
当查询执行获取时间而不是期望时,它会抛出超时异常。我们可以通过设置 commandtimeout=0 来解决它。当我们设置 commandtimeout=0 时,它会在完成执行后响应。
慕沐林林
TA贡献2016条经验 获得超9个赞
我也在想,也许是关于连接字符串,这里是:
Data Source=mydbserver;Initial Catalog=db1;Persist Security Info=True;User ID=bigboy;Password=bigboy;multipleactiveresultsets=True; 最大池大小=200;池化=真;连接超时=30;连接寿命=0;最小池大小=0;
- 2 回答
- 0 关注
- 486 浏览
添加回答
举报
0/150
提交
取消