服务器是windwos 2008R2、6核16G内存,其中SQL Server分配最大内存使用量为6G。
另外就是IIS中有几个很老的Web程序,稳定远行好多年了,也没有更新过,占用内存和CPU都很低,几乎可以忽略不计。
平常 cpu 占用都在5%以下,内存占用有6-7个G左右。
最近开发新项目,就用这台服务器当测试服务器用,新项目有三个程序,都是用asp.net core开发的,当前版本为7.0,分另是,一个webapi、一个状态服务和一个Blazor Server项目。
然后就老收到服务器内存过高报警,打开任务管理器/性能页面显示物理内存使用都在15.7、8左右,但切换进程选项查看这几个应用的内存使用量都不是太大,api 300M左右,Blazor Server300M左右、状态服务100M的样子。
我尝试将这几个程序退出,退出一个后内存立马下降3G左右,3个全部退出后就回到先前的状态。
反之,这几个应用中随便打开一个,任务管理器/性能页面内存图表立马就会上升将近3G左右,三个全部打开,几乎就是15.5+
这几个程序、api和Blazor Server都相对复杂些,用到了EF Core(7.0),可能会存因编码不当引起的内存占用过高,但状态服务这个非常简单,就一个IHostedService实现类,用的是sqlsugar。测试仅打开状态服务也是会一下就涨3G的内存占用。
最近才遇到,先前用.net6时没报警过,也没太注意内存占用。
我在开发机本机(win10/16G内存)运行和VS以调试模式运行这几个程序,任务管理器/进程 显示,内存使用量都是100M以下,VS调试时显示也不超过300M。
任务管理器/性能图表也几乎没有变化。
先前.net6的时候,状态服务和api在一个项目中,还没有拆分出来,所以不能断定这个就一定是升级到.net7才出现的(也就是以前只有2个应用,现在有三个)。
为了排除是因为编码引起的或其它原因,目前准备用Vs分别新建两个默认的asp.net core 项目(6.0和7.0),然后放到服务器上看看可否重现这个问题。
测试结果:
退回.net6.0编译后正常了...
这个问题可能是是 .NET 7 GC 的问题引起的
in .NET 7 we have enabled new Regions functionality within the GC. Here are the details: #43844. Since this was a foundational change, we also shipped a separate GC which keeps the previous "Segments" functionality -- in case there are some issues like this one.
1月会发布更新,可以试试目前的临时解决方法:添加环境变量 COMPlus_GCName=libclrgc.so
(linux) 或者 COMPlus_GCName=clrgc.dll
(windows)
@dudu: 测试了一下,修改环境变量没起到作用
没用过.net7,插个眼
删了删了删了删了删了删了删了删了删了删了删了删了删了
干嘛要删了 ?
这个问题.Net8也有,看来微软不会再为老系统修复这个问题
设置环境变量
DOTNET_GCName=clrgc.dll
DOTNET_EnableWriteXorExecute=0
或者以批处理的方式启动应用程序
@echo off
set DOTNET_GCName=clrgc.dll
set DOTNET_EnableWriteXorExecute=0
start "theApp" TheAppNet7.x64.exe