asp.net - 为什么一个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;
}
}
解决方案
Activation 对象中有什么?如果激活有很多孩子,在映射过程中,它可能会尝试填充所有的孩子和孩子的孩子……如果你使用 EF 延迟加载,EF 将为每个孩子创建一个子查询。
推荐阅读
- validation - 如何使自定义约束在 Grails 3.3.10 中工作?
- c# - 如何在 MVC4 的 if 条件中检查具有值“”的 String [] 数组?
- typescript - 为什么打字稿将联合中的属性标记为不存在?
- python - 如何在 python 中建模这个 MILP 问题?
- node.js - 在“pretest”脚本中执行两个 Sequelize 命令时出现“错误:验证错误”消息
- python - 如何使用 CNN 模型 Keras 解决错误?
- java - 如何通过 Spring Boot 查询区域内的点?
- angular - 在 Angular 8 中初始化嵌套对象的有效方法
- python - “依赖于安装的默认”目录布局背后的想法是什么?
- c++ - 在 C++ 中,struct 的内存结构是如何默认排列的?