Asp.Net core api 中没有释放内存
Posted
技术标签:
【中文标题】Asp.Net core api 中没有释放内存【英文标题】:Memory not getting freed up in Asp.Net core api 【发布时间】:2018-03-22 03:32:33 【问题描述】:我的 .NET Core Web API 中的内存没有被释放。我所做的只是从静态类返回一个字符串。
API:
[HttpGet]
public string Get()
return A.get();
public static class A
public static string get()
return "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
客户:
HttpClient hc = new HttpClient();
for(int i=0;i<100000;i++)
//var v = hc.GetAsync("http://localhost:52425/api/values").result;
hc.GetStringAsync("http://localhost:52425/api/values");
if(i%1000 == 0)
Thread.Sleep(10000);
Console.WriteLine("Sleeping-----------" + i);
我尝试过直接从操作方法返回字符串,而不使用静态类。我还尝试以同步方式而不是异步方式从客户端调用 API。这些都没有任何区别。
这个截图显示了在哪里调用了一次GC,但没有帮助清理内存。
以下是升级到 2.0 并禁用遥测信息后的诊断:
【问题讨论】:
您使用的是哪个版本的 .NET Core? 另外,您是在 IIS 还是 Kestrel 上运行 WebAPI? 我正在使用 netcore1.2,并且在 IIS 上运行。上面的代码在 cloudfoundry 上运行时 256 ram 抛出 OOM 异常 【参考方案1】:即使您不使用 Application Insights,它似乎也在收集数据,因此您会看到内存增加。一段时间后,这些对象被 GC 收集。
Visual Studio 默认开启应用洞察。有两个选项可以关闭 Application Insights:
-
将
TelemetryConfiguration.Active.DisableTelemetry = true;
添加到ConfigureServices,您应该会看到性能改进。
在launchSettings.json中添加ASPNETCORE_preventHostingStartup
键:
"environmentVariables": "ASPNETCORE_ENVIRONMENT": "Development", "ASPNETCORE_preventHostingStartup": "True"
这个可能会关闭其他一些东西。阅读更多关于它的信息here。
【讨论】:
在 100k 请求后,我偶尔会访问该服务。我继续运行该应用程序几个小时,内存没有下降。我将尝试您提到的选项并在此处更新结果。感谢您的建议 另外,我建议切换到 .NET Core 2.0,因为有很多改进。 升级到 2.0 并关闭遥测有助于提高性能(处理器),但并没有真正帮助记忆。甚至没有调用 GC(屏幕截图添加到实际问题)。我猜 GC 在采取行动之前正在查看可用的 ram(我的 PC 上有 12GB 免费)。任何想法我怎么能控制这个。我在使用 netcore1.2 的 cloudfoundry(2 个 1Gb 实例)中观察到的另一件事是,如果内存达到 ~900Mb 左右,那么 gc 会清除内存并保持在 ~350MB 左右。但是,如果同一个云代工厂实例是 512,每个 GC 永远无法正常工作,我会收到 OOM 错误。 我认为您应该在asp.net core github repo 上提交票证。另外,请在此处留下票证链接,以防有人来这里寻找相同问题的解决方案。以上是关于Asp.Net core api 中没有释放内存的主要内容,如果未能解决你的问题,请参考以下文章
在 Asp.NET core 中触发 Quartz 作业时释放上下文
ASP.NET Core Web API 模板中没有个人用户帐户身份验证选项
注入 DbContext 时无法访问 ASP.NET Core 中已释放的对象
ASP.NET Web API 与 ASP.NET Core 中的 URL 匹配差异