You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core API在Ubuntu内存占用过高及多进程问题咨询

ASP.NET Core API在Ubuntu上内存偏高及多进程问题解析

一、为何出现多个同一应用的操作系统进程?

  • 线程/进程混淆:htop默认显示进程,但如果开启了线程显示(按H键切换),会把应用的线程(比如GC线程、业务工作线程)当成独立条目展示。ASP.NET Core启用Server GC时,会为每个CPU核心分配GC后台线程,加上业务线程后,看起来像多个“进程”,但实际属于同一主进程。
  • 多实例部署:如果你的部署配置(比如systemd服务脚本、反向代理规则)刻意启动了多个应用实例(为了利用多核提升吞吐量),就会出现多个独立进程。
  • 进程残留:应用异常重启时,旧进程未被正确回收(比如kill命令没清理干净子进程、systemd配置不当),会导致新旧进程共存。

二、Ubuntu上内存占用高于Windows的原因及优化方案

核心原因:

  • GC策略差异:Linux下.NET默认启用Server GC(针对服务器场景优化,优先保障吞吐量),会预留更大的内存池来减少GC触发频率,导致驻留内存(RSS)偏高;而Windows桌面环境默认用Workstation GC,内存占用更偏向保守。
  • 内存统计口径不同:Windows任务管理器显示的是应用私有工作集,而htop的RSS包含了系统共享库(如.NET运行时)的内存,数值看起来更高,但实际应用私有内存的差异可能并不大。
  • Linux内存管理特性:Linux会用空闲内存做文件缓存,RSS高不一定代表内存被“占用”,系统会在需要时自动回收缓存内存,可用free -h查看实际可用内存。

优化方案:

  • 调整GC策略:如果服务器内存紧张,可在runtimeconfig.json中切换为Workstation GC:
    {
      "runtimeOptions": {
        "configProperties": {
          "System.GC.Server": false
        }
      }
    }
    
  • 精准监控内存:用.NET官方工具dotnet-counters查看应用真实内存使用:
    dotnet-counters monitor --process-id <你的应用PID> System.Runtime
    
  • 清理残留进程:检查systemd服务配置,确保重启时杀死旧进程,比如在.service文件中添加:
    ExecStartPre=/usr/bin/pkill -f <应用名称>
    
  • 排查内存泄漏:如果怀疑存在泄漏,用dotnet-dump生成内存快照分析:
    dotnet-dump collect -p <PID>
    dotnet-dump analyze <生成的dump文件>
    

内容的提问来源于stack exchange,提问作者Mohab Alnajjar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 20:22:38