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 匹配差异

[Asp.Net Core]ASP.NET Core WebApi使用Swagger生成api说明文档看这篇就够了

如何在 ASP.Net Core 使用 内存缓存