【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

 



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

相关文章
|
SQL 安全 网络协议
命令执行/SQL盲注无回显外带方式
命令执行/SQL盲注无回显外带方式
652 0
|
存储 安全 区块链
未来网络架构:从中心化到去中心化的演进
【10月更文挑战第20天】 在数字时代,网络架构是支撑信息社会的基石。本文将探讨网络架构如何从传统的中心化模式逐步演变为更加灵活、高效的去中心化模式。我们将分析这一转变背后的技术驱动力,包括区块链、分布式账本技术和点对点(P2P)网络,以及这些技术如何共同作用于网络的未来形态。文章还将讨论去中心化网络架构面临的挑战和潜在的解决方案,为读者提供一个关于网络未来发展的宏观视角。
680 12
|
人工智能 IDE 程序员
Qoder用户上手指南:安装、登录、快捷键、功能亮点(新用户免费领300credits,首购2美元/月)
这个容易让程序员上瘾的 Agentic Coding 平台有哪些上头的功能?对于小白开发者和资深开发者如何用好Qoder呢?
11958 6
Qoder用户上手指南:安装、登录、快捷键、功能亮点(新用户免费领300credits,首购2美元/月)
|
5月前
|
供应链 监控 API
唯品会 API 接口:解锁唯品会特卖商品供应链优势密码
唯品会凭借特卖模式与高效供应链脱颖而出,其API接口通过实时数据与自动化操作,助力开发者与企业优化库存、降低成本,提升供应链响应速度与商业价值。
146 0
|
人工智能 运维 监控
超越传统网络防护,下一代防火墙安全策略解读
超越传统网络防护,下一代防火墙安全策略解读
457 6
|
编译器 C语言
动态内存分配与管理详解(附加笔试题分析)(上)
动态内存分配与管理详解(附加笔试题分析)
|
人工智能 自然语言处理 语音技术
《AI赋能鸿蒙Next:为特殊人群打造无障碍交互新体验》
在科技飞速发展的今天,鸿蒙Next设备借助人工智能技术,显著提升了特殊人群的无障碍交互体验。针对视障人群,提供精准屏幕朗读、视觉辅助智能问答和导航避障辅助;面向听障人群,实现AI声音修复、实时字幕与语音转文字;助力语言障碍者和老年人群体,通过AI优化交流与操作体验。开发者可利用鸿蒙Next的AI能力,深入了解用户需求,进行测试与优化,共同创造友好、便捷的无障碍环境,让特殊人群更好地融入数字社会,享受科技带来的美好生活。
652 8
|
JavaScript
js多条件筛选(可单条件搜索还可以模糊查询)
js多条件筛选(可单条件搜索还可以模糊查询)
529 0
Linux中的Base64编码与解码:`base64`命令详解
Linux的`base64`命令用于Base64编码和解码文本数据,常在邮件和HTTP中传输二进制信息。编码示例:`base64 input.txt`,解码示例:`base64 -d encoded.txt`或`echo "SGVsbG8sIFdvcmxkIQo=" | base64 -d`。注意,编码后数据会增大33%,且可能含换行符。广泛应用于多种系统和协议,如MIME。
|
存储 NoSQL 关系型数据库
EAV模型(实体-属性-值)的设计和低代码的处理方案(1)
EAV模型(实体-属性-值)的设计和低代码的处理方案(1)