文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

asp.netcore服务限制堆内存大小的操作方法

2024-04-02 19:55

关注

前言

在我们众多的微服务项目中,都有限制其堆内存大小的需求,以免占用宿主机内存过高。

在java中我们可以通过jvm参数来很好的控制堆内存以及其他参数。

但是在asp.net core的web服务中,我们该如何去限制堆内存大小呢?

提示:以下是本篇文章正文内容,下面案例可供参考

1、asp.net core是什么

微软旗下支持跨平台的开发框架,与springboot思想类似,支持ioc等,可以快速的开发web api等项目
官方文档:https://learn.microsoft.com/zh-cn/aspnet/core/introduction-to-aspnet-core?view=aspnetcore-6.0

2、限制其堆内存最大大小

建议熟读官方文档:https://learn.microsoft.com/zh-cn/dotnet/core/runtime-config/

2.1 设置.NET 运行时的配置

官网文档:https://learn.microsoft.com/zh-cn/dotnet/core/runtime-config/#runtimeconfigjson

.NET 提供了以下机制用于配置 .NET 运行时的行为:

通过使用环境变量来配置某个选项会将设置应用于所有的 .NET 应用。 在 runtimeconfig.json 或项目文件中配置某个选项则只会将设置应用于该应用程序。

选择 runtimeconfig.json文件作为.net运行时的配置文件。

2.2 在项目中创建runtimeconfig.json配置文件

构建项目时,将在打包的输出目录中生成 [appname].runtimeconfig.json 文件。

如果项目文件所在的文件夹中存在 runtimeconfig.template.json 文件,它包含的任何配置选项都将插入到 [appname].runtimeconfig.json 文件中。

如果自行构建应用,请将所有配置选项放在 runtimeconfig.template.json 文件中。 如果只是运行应用,请将其直接插入 [appname].runtimeconfig.template.json 文件中。

在这里插入图片描述

2.2 限制堆的大小

示例:限制堆内存最大为1G

{
    "configProperties": {
      "System.GC.HeapHardLimit": 1073741824
    }
}

3、测试配置是否生效

测试控制器:

[Route("api/[controller]/[action]")]
[ApiController]
public class TestController : ControllerBase
{
    [HttpGet]
    public void testMemory()
    {
        List<byte[]> bytesList = new List<byte[]>();
        while (true)
        {
            Console.ReadKey();
            // 100m
            for (int i = 0; i < 100; i++)
            {
                // 1mb
                byte[] bytes = new byte[1024 * 1024];
                bytesList.Add(bytes);
            }
            Console.WriteLine("当前堆内存大小 -- " + GC.GetTotalMemory(false) / 1024 / 1024.0 + " MB");
        }

    }
}

结果,可见配置生效,达到1g时报错 System.OutOfMemoryException,然后系统强行gc,服务down,配置docker-compose的自动重启即可完成gc后自动重启

当前堆内存大小 -- 102.0029296875 MB
当前堆内存大小 -- 202.013671875 MB
当前堆内存大小 -- 302.0166015625 MB
当前堆内存大小 -- 402.0126953125 MB
当前堆内存大小 -- 502.0166015625 MB
当前堆内存大小 -- 602.02734375 MB
当前堆内存大小 -- 702.044921875 MB
当前堆内存大小 -- 802.046875 MB
当前堆内存大小 -- 902.0498046875 MB
info: Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker[2]
      Executed action office_conver_server.Controllers.TestController.testMemory (office-conver-server) in 5924.7612ms
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[1]
      Executed endpoint 'office_conver_server.Controllers.TestController.testMemory (office-conver-server)'
fail: Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware[1]
      An unhandled exception has occurred while executing the request.
      System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown.
         at office_conver_server.Controllers.TestController.testMemory() in D:\BaiduSyncdisk\项目目录\ItemProjects\dotnet\office-conver-server\Controllers\TestController.cs:line 49
         at Microsoft.Extensions.Internal.ObjectMethodExecutor.<>c__DisplayClass33_0.<WrapVoidMethod>b__0(Object target, Object[] parameters)
         at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.VoidResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Obje
ct[] arguments)
         at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeActionMethodAsync()
         at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
         at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeNextActionFilterAsync()
      --- End of stack trace from previous location ---
         at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context)
         at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
         at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync()
      --- End of stack trace from previous location ---
         at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeFilterPipelineAsync>g__Awaited|20_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object sta
te, Boolean isCompleted)
         at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Logged|17_1(ResourceInvoker invoker)
         at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Logged|17_1(ResourceInvoker invoker)
         at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)
         at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
         at Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke(HttpContext httpContext)
         at Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext, ISwaggerProvider swaggerProvider)
         at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)

4、在docker容器中限制堆内存大小

可以采用上述配置,但是缺点就是不灵活,需要频繁更新代码,更新容器。。。

添加容器环境变量DOTNET_GCHeapHardLimit: "value"
注意value是十六进制

version: "3"
services:
  officeConverServer:
    image: l-4.1-office-conver-server:test
    ports:
      - 8079:80
    volumes:
      - ./uploadFile:/uploadFile
      #- ./office-conver-server.runtimeconfig.json:/app/office-conver-server.runtimeconfig.json
      - ./appsettings.json:/app/appsettings.json
    environment:
      # 堆内存最大限制【十六进制】
      DOTNET_GCHeapHardLimit: "40000000"
      TZ: Asia/Shanghai
   # deploy: 
    #  resources: 
     #   limits: 
      #    memory: 1G
    restart: always
    security_opt:
      - seccomp:unconfined

到此这篇关于asp.net core服务限制堆内存大小的文章就介绍到这了,更多相关asp.net core堆内存大小内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯