5

我有一个在 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 作业的 Singleton,以每隔一分钟查询数据库以获取一些查找数据。但它没有帮助。

然后我尝试添加另一个计时器作业来查询步骤 N3 中仅针对 DB 中的第一条记录所需的数据,没有一些特定的 req 参数并且它没有帮助,而且它开始工作的速度更慢。

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

有什么想法吗,伙计们?

4

2 回答 2

0

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

于 2018-08-01T07:51:52.883 回答
-1

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

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

于 2018-08-01T07:47:17.410 回答