【App Service】.NET 应用在App Service上内存无法占用100%的问题原因

简介: 在Azure App Service(Windows)部署.NET应用时,即使内存未满100%,也可能出现OOM错误。原因是.NET运行时对GC堆内存设有硬限制,默认仅使用75%的可用内存。可通过配置`runtimeconfig.json`中的`System.GC.HeapHardLimitPercent`或`HeapHardLimit`参数调整该限制,提升内存利用率。

问题描述

如果使用Azure App Service部署.NET 应用,会发现在内容并没有达到100%的时候,也会出现OOM错误。这是一个什么情况呢?


大内存测试代码

static void Main(string[] args)
        {
            Console.WriteLine("Hello, World!");
            int objunmbers = 20000;
            byte[][] largeArray = new byte[objunmbers][];
            Console.WriteLine("Start to create big memory object ... from 2GB");
            //Console.WriteLine("Start to create big memory object ... from 20MB");
            long size = 2L * 1024 * 1024 * 1024; // 2GB
            //long size = 2L * 1024 * 1024 * 10; // 20MB
            int times = 1;
            while (size > 0)
            {
                if (CreateBigMemoryObject(largeArray,size, times))
                {
                    Console.WriteLine($"[{times}] Successfully created memory object of size: {size} bytes ({size / 1024 / 1024} MB)");
                    times = times + 1;
                }
                else
                {
                    Console.WriteLine($"Failed to create memory object of size: {size} bytes ({size / 1024 / 1024} MB). Trying smaller size...");
                    size = size - 100 * 1024 * 1024; // Decrease by 100MB
                    //size = size - 1 * 1024 * 1024; // Decrease by 1MB
                }
                //Thread.Sleep(2000);
            }
            Console.WriteLine("Finished memory allocation attempts.");
            Console.WriteLine("sleep 5 mins");
            Thread.Sleep(5 * 60 * 1000);
            Console.WriteLine("End");
        }
       static bool CreateBigMemoryObject(byte[][] largeArray,long size,int index)
        {
            try
            {
                largeArray[index] = new byte[size];
                return true;
            }
            catch (OutOfMemoryException ex)
            {
                Console.WriteLine($"OutOfMemoryException: {ex.Message}");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Exception: {ex.Message}");
            }
            return false;
        }



问题解答

在反复试验后,证明这是.NET 应用在 Azure App Service(Windows) 上才会遇见的问题。

根本原因是:.NET Core 在运行时会对 GC 堆的最大可用内存设定一个Hard Limit,而App Service中设定的值为 75%, 所以32Gb的内容最大可用24Gb。

( Manage resource usage for all GC flavors : https://learn.microsoft.com/en-us/dotnet/core/runtime-config/garbage-collector#manage-resource-usage-for-all-gc-flavors )

当然,知道这个限制之后,就可以通过配置去修改它,比如通过配置 runtimeconfig.json 文件,设置 System.GC.HeapHardLimitPercent : 96  或者  System.GC.HeapHardLimit : 32,000,000,000

 

 

参考资料

Manage resource usage for all GC flavors : https://learn.microsoft.com/en-us/dotnet/core/runtime-config/garbage-collector#manage-resource-usage-for-all-gc-flavors

 



当在复杂的环境中面临问题,格物之道需:浊而静之徐清,安以动之徐生。 云中,恰是如此!

相关文章
|
21天前
|
开发工具
【Azure 环境】使用Connect-MgGraph 命令登录中国区Azure遇见报错 AADSTS700016
使用Connect-MgGraph登录中国区Azure时,因应用ID未注册导致AADSTS700016错误。解决方法:在Azure Entra ID中注册新应用,配置正确重定向URI,并使用Client ID和Tenant ID登录即可成功。
87 13
|
5月前
|
Java API 开发工具
【Azure Developer】Java代码实现获取Azure 资源的指标数据却报错 "invalid time interval input"
在使用 Java 调用虚拟机 API 获取指标数据时,因本地时区设置非 UTC,导致时间格式解析错误。解决方法是在代码中手动指定时区为 UTC,使用 `ZoneOffset.ofHours(0)` 并结合 `withOffsetSameInstant` 方法进行时区转换,从而避免因时区差异引发的时间格式问题。
290 3
|
存储 安全 区块链
未来网络架构:从中心化到去中心化的演进
【10月更文挑战第20天】 在数字时代,网络架构是支撑信息社会的基石。本文将探讨网络架构如何从传统的中心化模式逐步演变为更加灵活、高效的去中心化模式。我们将分析这一转变背后的技术驱动力,包括区块链、分布式账本技术和点对点(P2P)网络,以及这些技术如何共同作用于网络的未来形态。文章还将讨论去中心化网络架构面临的挑战和潜在的解决方案,为读者提供一个关于网络未来发展的宏观视角。
666 12
|
人工智能 IDE 程序员
Qoder用户上手指南:安装、登录、快捷键、功能亮点(新用户免费领300credits,首购2美元/月)
这个容易让程序员上瘾的 Agentic Coding 平台有哪些上头的功能?对于小白开发者和资深开发者如何用好Qoder呢?
11262 6
Qoder用户上手指南:安装、登录、快捷键、功能亮点(新用户免费领300credits,首购2美元/月)
|
4月前
|
机器学习/深度学习 Kubernetes API
【Azure APIM】自建网关(self-host gateway)收集请求的Header和Body内容到日志中的办法
在Azure API Management中,通过配置trace策略可完整记录API请求的Header和Body信息。在Inbound和Outbound策略中分别使用context.Request/Response.Headers和Body.As<string>方法捕获数据,并写入Trace日志,便于排查与审计。
153 7
|
11月前
|
SQL 自然语言处理 数据库
【Azure Developer】分享两段Python代码处理表格(CSV格式)数据 : 根据每列的内容生成SQL语句
本文介绍了使用Python Pandas处理数据收集任务中格式不统一的问题。针对两种情况:服务名对应多人拥有状态(1/0表示),以及服务名与人名重复列的情况,分别采用双层for循环和字典数据结构实现数据转换,最终生成Name对应的Services列表(逗号分隔)。此方法高效解决大量数据的人工处理难题,减少错误并提升效率。文中附带代码示例及执行结果截图,便于理解和实践。
288 4
|
6月前
|
网络协议 关系型数据库 Linux
【App Service Linux】在Linux App Service中安装 tcpdump 并抓取网络包
在App Service for Linux环境中,无法像Windows一样直接使用网络排查工具抓包。本文介绍了如何通过TCPDUMP在Linux环境下抓取网络包,包括SSH进入容器、安装tcpdump、执行抓包命令及下载分析文件的完整操作步骤。
297 5
|
人工智能 运维 监控
超越传统网络防护,下一代防火墙安全策略解读
超越传统网络防护,下一代防火墙安全策略解读
454 6
|
8月前
|
NoSQL 网络协议 Java
【Azure Redis】Redis服务端的故障转移(Failover)导致客户端应用出现15分钟超时问题的模拟及解决
在使用 Azure Cache for Redis 服务时,因服务端维护可能触发故障转移。Linux 环境下使用 Lettuce SDK 会遇到超时 15 分钟的已知问题。本文介绍如何通过重启 Primary 节点主动复现故障转移,并提供多种解决方案,包括调整 TCP 设置、升级 Lettuce 版本、配置 TCP_USER_TIMEOUT 及使用其他 SDK(如 Jedis)来规避此问题。
287 1
|
11月前
|
JSON 数据格式
【Azure Fabric Service】演示使用PowerShell命令部署SF应用程序(.NET)
本文详细介绍了在中国区微软云Azure上使用Service Fabrics服务时,通过PowerShell命令发布.NET应用的全过程。由于Visual Studio 2022无法直接发布应用,需借助PowerShell脚本完成部署。文章分三步讲解:首先在Visual Studio 2022中打包应用部署包,其次连接SF集群并上传部署包,最后注册应用类型、创建实例并启动服务。过程中涉及关键参数如服务器证书指纹和服务端证书指纹的获取,并附带图文说明,便于操作。参考官方文档,帮助用户成功部署并运行服务。
347 73