搜索

查看: 3138|回复: 11

[ASP.NET] asp.net core服务限制堆内存大小的操作方法

[复制链接]
发表于 2023-5-4 11:30:21 | 显示全部楼层 |阅读模式
Editor 2023-5-4 11:30:21 3138 11 看全部
目录
  • 前言
  • 1、asp.net core是什么
  • 2、限制其堆内存最大大小
  • 2.1 设置.NET 运行时的配置
  • 2.2 在项目中创建runtimeconfig.json配置文件
  • 2.2 限制堆的大小
  • 3、测试配置是否生效
  • 4、在docker容器中限制堆内存大小
    前言
    在我们众多的微服务项目中,都有限制其堆内存大小的需求,以免占用宿主机内存过高。
    在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 运行时的行为:
  • runtimeconfig.json 文件
  • MSBuild 属性
  • 环境变量
    通过使用环境变量来配置某个选项会将设置应用于所有的 .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 文件中。

    202209220920358.png

    202209220920358.png


    2.2 限制堆的大小
  • 指定 GC 堆和 GC 簿记的最大提交大小(以字节为单位)。
  • 此设置仅适用于 64 位计算机。
  • 如果已配置每对象堆限制,则忽略此设置。
  • 默认值(仅在某些情况下适用)是 20 MB 或容器内存限制的 75%(以较大者为准)。 此默认值在以下情况下适用:进程正在具有指定内存限制的容器中运行。HeapHardLimitPercent 未设置。
    示例:限制堆内存最大为1G
    {
        "configProperties": {
          "System.GC.HeapHardLimit": 1073741824
        }
    }

    3、测试配置是否生效
    测试控制器:
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class TestController : ControllerBase
    {
        [HttpGet]
        public void testMemory()
        {
            List bytesList = new List();
            while (true)
            {
                Console.ReadKey();
                // 100m
                for (int i = 0; i
    结果,可见配置生效,达到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.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.[I]g__Awaited|20_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object sta
    te, Boolean isCompleted)
             at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.[I]g__Logged|17_1(ResourceInvoker invoker)
             at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.[I]g__Logged|17_1(ResourceInvoker invoker)
             at Microsoft.AspNetCore.Routing.EndpointMiddleware.[I]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堆内存大小内容请搜索知鸟论坛以前的文章或继续浏览下面的相关文章希望大家以后多多支持知鸟论坛
  • 回复

    使用道具 举报

    发表于 2023-6-28 22:20:00 | 显示全部楼层
    123456823 2023-6-28 22:20:00 看全部
    楼主太厉害了!楼主,I*老*虎*U!我觉得知鸟论坛真是个好地方!
    回复

    使用道具 举报

    发表于 2023-6-29 01:33:31 | 显示全部楼层
    掌舵的鱼1987 2023-6-29 01:33:31 看全部
    感谢楼主的无私分享!要想知鸟论坛好 就靠你我他
    回复

    使用道具 举报

    发表于 2023-6-29 13:56:43 | 显示全部楼层
    惜颜705 2023-6-29 13:56:43 看全部
    这个帖子不回对不起自己!我想我是一天也不能离开知鸟论坛
    回复

    使用道具 举报

    发表于 2023-6-29 17:22:38 | 显示全部楼层
    冀苍鸾 2023-6-29 17:22:38 看全部
    我看不错噢 谢谢楼主!知鸟论坛越来越好!
    回复

    使用道具 举报

    发表于 2023-6-30 10:40:07 | 显示全部楼层
    Gordon520 2023-6-30 10:40:07 看全部
    楼主,大恩不言谢了!知鸟论坛是最棒的!
    回复

    使用道具 举报

    发表于 2023-6-30 22:19:05 | 显示全部楼层
    xinting_6ym 2023-6-30 22:19:05 看全部
    楼主,我太崇拜你了!我想我是一天也不能离开知鸟论坛
    回复

    使用道具 举报

    发表于 2023-6-30 22:58:11 | 显示全部楼层
    123456865 2023-6-30 22:58:11 看全部
    既然你诚信诚意的推荐了,那我就勉为其难的看看吧!知鸟论坛不走平凡路。
    回复

    使用道具 举报

    发表于 2023-7-3 13:58:47 | 显示全部楼层
    123456868 2023-7-3 13:58:47 看全部
    楼主,大恩不言谢了!知鸟论坛是最棒的!
    回复

    使用道具 举报

    发表于 2023-7-3 21:25:37 | 显示全部楼层
    无人岛屿颈 2023-7-3 21:25:37 看全部
    楼主,大恩不言谢了!知鸟论坛是最棒的!
    回复

    使用道具 举报

    • 您可能感兴趣
    点击右侧快捷回复 【请勿灌水】
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则 返回列表

    RSS订阅| SiteMap| 小黑屋| 知鸟论坛
    联系邮箱E-mail:zniao@foxmail.com
    快速回复 返回顶部 返回列表