ASP.NET Core:具有延迟的调用之间的空闲超时

我有一个在 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) 语句,但它没有帮助。


有什么想法吗,伙计们?


婷婷同学_
浏览 490回答 2
2回答

湖上湖

当查询执行获取时间而不是期望时,它会抛出超时异常。我们可以通过设置 commandtimeout=0 来解决它。当我们设置 commandtimeout=0 时,它会在完成执行后响应。

慕沐林林

我也在想,也许是关于连接字符串,这里是:Data Source=mydbserver;Initial Catalog=db1;Persist Security Info=True;User ID=bigboy;Password=bigboy;multipleactiveresultsets=True;&nbsp;最大池大小=200;池化=真;连接超时=30;连接寿命=0;最小池大小=0;
打开App,查看更多内容
随时随地看视频慕课网APP