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

Tom*_*yer 5 c# sql-server asp.net-mvc kestrel 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();
}
Run Code Online (Sandbox Code Playgroud)

它帮助我使我的服务更快地工作,但问题仍然存在。

该服务的基本逻辑如下:1) 获取请求对象 2) 将其解析为 POCO 类的实例 3) 使用多个 SELECT 调用 DB 以获取所有需要的数据(为此我使用 Dapper以及允许一次性运行多个SQL查询的方法)4)使用新接收的数据更新对象的实例并将对象插入数据库

就是这样。

而且我无法弄清楚是什么导致了这种延迟(空闲时间)。

我猜测也许我应该有一些虚拟调用来保持服务运行。所以我添加了一个包含 Timer 作业的单例来每分钟查询数据库以获取一些查找数据。但它没有帮助。

然后我尝试添加另一个计时器作业来查询步骤 N3 中所需的数据,这些数据仅用于数据库中的第 1 条记录,没有一些特定的 req 参数,但它没有帮助,而且它开始工作得更慢。

我还在表上添加了索引,以使 SELECT 更快地工作,另外我向所有 SELECT 添加了 WITH(NOLOCK) 语句,但它没有帮助。

有什么想法吗,伙计们?

Tom*_*yer -1

我也在想也许这与连接字符串有关,这里是:

数据源=mydbserver;初始目录=db1;持久安全信息=True;用户ID=bigboy;密码=bigboy;multipleactiveresultsets=True; 最大池大小=200;池=true;连接超时=30; 连接寿命=0;最小池大小=0;