You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何为IIS中的ASP.NET 4.8应用池配置垃圾回收并设置GCConserveMemory参数以优化内存占用?

如何为IIS中的ASP.NET 4.8应用池配置垃圾回收并设置GCConserveMemory参数以优化内存占用?

你这个问题问到点子上了!确实,ASP.NET 4.8在IIS里的应用池进程配置和桌面程序完全不一样——毕竟一个应用池的w3wp进程可能同时跑好几个web应用,单个应用的web.config根本管不了进程级的CLR垃圾回收设置。我来给你讲两种靠谱的配置方法,刚好匹配你“牺牲一点性能换更低内存占用”的需求:

方法一:针对同CLR架构的所有应用池配置

如果你的服务器上多个应用池都用的是同一种架构(x86或x64)的.NET 4.8 CLR,而且想给它们统一开GCConserveMemory,可以用这个方法:

  1. 先确定应用池的CLR架构:打开IIS管理器,找到目标应用池,右键选「高级设置」,看「启用32位应用程序」选项——选「True」就是x86架构,对应路径C:\Windows\Microsoft.NET\Framework\v4.0.30319;选「False」就是x64架构,对应路径C:\Windows\Microsoft.NET\Framework64\v4.0.30319
  2. 找到对应路径后,在该目录下创建(或编辑已有的)w3wp.exe.config文件,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <runtime>
        <GCConserveMemory enabled="true" />
    </runtime>
</configuration>
  1. 重启目标应用池,让配置生效。

注意:这个方法会影响所有使用该CLR架构的应用池,如果你只想给特定应用池单独配置,别用这个。

方法二:为单个应用池单独配置(不影响其他应用)

如果你只想让某一个应用池启用GCConserveMemory,完全不碰其他应用池的配置,就用这个更精准的方法:

  1. 用管理员权限打开IIS的配置文件C:\Windows\System32\inetsrv\config\applicationHost.config(如果是x64系统,建议用64位编辑器打开,比如管理员模式的记事本,避免路径映射问题)。
  2. 在文件里找到目标应用池的<add>节点,比如你应用池叫「MyMemoryOptPool」,节点大概长这样:
<add name="MyMemoryOptPool" autoStart="true" managedRuntimeVersion="v4.0" managedPipelineMode="Integrated" />
  1. 给这个节点加上clrConfigFile属性,指定一个自定义配置文件的绝对路径,修改后变成:
<add name="MyMemoryOptPool" autoStart="true" managedRuntimeVersion="v4.0" managedPipelineMode="Integrated" clrConfigFile="C:\IISConfigs\MyPoolGCConfig.config" />
  1. 按照你指定的路径创建这个自定义配置文件,内容和之前一样:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <runtime>
        <GCConserveMemory enabled="true" />
    </runtime>
</configuration>
  1. 重启目标应用池,配置就会生效了。

几个关键提示要记牢

  • 启用GCConserveMemory后,CLR的垃圾回收器会更积极地释放内存,但同时GC的运行频率会变高,确实会带来一点性能损耗,这和你之前的预期完全匹配,刚好是用性能换内存的取舍。
  • 别随便修改全局的machine.config文件!这个文件会影响所有.NET 4.x的应用,包括桌面程序、其他IIS应用池,风险太高了。
  • 验证配置是否生效的小技巧:可以用Process Explorer查看w3wp进程加载的配置文件,或者打开性能监视器,观察「.NET CLR Memory」分类下的「# Bytes in All Heaps」计数器,看看内存占用有没有下降,同时「% Time in GC」计数器会不会小幅上升。

内容来源于stack exchange

火山引擎 最新活动