用.netcore 2.2+ 创建WebApi项目,服务器为k8s+docker+linux环境。
上线初期,由于调用方调用次数较少,会出现这么一个情况,每隔几分钟再次调用,第1次接口都会变慢,继续调用速度又变快了。根据以往的经验,这个情况有点像似 IIS里应用程序池被回收造成的。而.netcore采用kestrel作为边缘服务器,没有应用程序池回收这一说法,但是应该是类似的原因。
看官方文档,发现Kestrel有个选项属性 “保持活动状态超时”,即为KeepAliveTimeout ,默认为2分钟,项目的这个情况是否是这个 选项造成的呢?根据官方文档,修改代码,将
保持活动状态超时 KeepAliveTimeout 设置为10分钟试一试。
代码如下:
在Program.cs里
public class Program { public static void Main(string[] args) { System.Threading.ThreadPool.SetMinThreads(200, 200); CreateWebHostBuilder(args).Build().Run(); } public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args). ConfigureLogging((context, loggingbuilder) => { //该方法需要引入Microsoft.Extensions.Logging名称空间 loggingbuilder.AddFilter("System", LogLevel.Warning); //过滤掉系统默认的一些日志 loggingbuilder.AddFilter("Microsoft", LogLevel.Warning);//过滤掉系统默认的一些日志 //var path = Directory.GetCurrentDirectory() + "\log4net.config"; //不带参数:表示log4net.config的配置文件就在应用程序根目录下,也可以指定配置文件的路径 loggingbuilder.SetMinimumLevel(LogLevel.Debug); loggingbuilder.AddLog4Net("Config/log4net.config"); }) .UseStartup<Startup>() .ConfigureKestrel((context, serverOptions) => { //为整个应用设置并发打开的最大 TCP 连接数,默认情况下,最大连接数不受限制 (NULL) serverOptions.Limits.MaxConcurrentConnections = 100; //对于已从 HTTP 或 HTTPS 升级到另一个协议(例如,Websocket 请求)的连接,有一个单独的限制。 连接升级后,不会计入 MaxConcurrentConnections 限制 serverOptions.Limits.MaxConcurrentUpgradedConnections = 100; //获取或设置保持活动状态超时。 默认值为 2 分钟。 serverOptions.Limits.KeepAliveTimeout = TimeSpan.FromMinutes(10); // serverOptions.Limits.RequestHeadersTimeout = TimeSpan.FromMinutes(1); }); }
测试下来,感觉不怎么管用。有谁能知道这个 KeepAliveTimeout 是干嘛的吗?