首页 > 解决方案 > 为什么一个asp.net web 服务会占用这么多内存?

问题描述

我有一个 .net Web 服务(Web API 2),它接受从数据库中获取数据的请求。返回的数据不是很大,通常只有 1-3 kb(大约 1-15 行来自数据库)。我在 IIS 中对其进行了设置并对其进行了一些批量测试,在一个小时左右的时间内它受到了很多打击,因此它收到了数千个请求。当我查看 w3wp.exe(IIS 工作进程)时,内存不断增加,直到超过 5 GB,CPU 使用率接近 100%,然后最终 Web 服务停止工作。服务器有 16gb 的内存,我们只是从 8 增加它。5gb 的内存正常吗?这似乎很多,我会假设垃圾收集会更好地处理这个问题。我在使用性能监视器或其他东西来解决此类问题方面不是很有经验。

关于我可以看什么的任何建议?会不会有内存泄漏?我应该尝试在达到一定内存量时让应用程序池回收吗?

更新 - 我们有另一个 .net Web 服务,它甚至不访问数据库或任何外部文件或任何东西,它的行为方式相同 - 内存不断增加。我们的计划是可能将每个应用程序池设置为每 x 分钟或达到一定内存量时回收。

以下是 API 中典型函数的示例:

[Route("patient/{patientKey}/activations")]
public async Task<IHttpActionResult> GetActivations(int patientKey)
{
     try
     {
          ActivationList actList = new ActivationList();

          actList.Activations = await _actProc.GetByPatient(patientKey);

          return Ok<ActivationList>(actList);
     }
     catch (Exception ex)
     {
         return new BadRequestWithInfoResult(Translators.makeXML<ErrorReturn>(CreateError(ex)));
     }
}

public async Task<List<Activation>> GetByPatient(long patientKey)
{
     using (var dbConn = _database.CreateConnection())
     {
          List<DBActivation> lst_Activation = await dbConn.FetchAsync<DBActivation>("select * from fact.Activation where PatientKey = " + patientKey.ToString());

          List<Activation> Activations = lst_Activation.Select(x => _mapper.Map<Activation>(x)).ToList<Activation>();              

          return Activations;
     }
}

标签: asp.net.netiismemory

解决方案


Activation 对象中有什么?如果激活有很多孩子,在映射过程中,它可能会尝试填充所有的孩子和孩子的孩子……如果你使用 EF 延迟加载,EF 将为每个孩子创建一个子查询。


推荐阅读