我有一个 .net Web 服务 (Web API 2),它接受请求以从数据库获取数据。返回的数据不是很大,通常只有 1-3 kb(大约来自数据库的 1-15 行)。我在 IIS 中设置了它并对其进行了一些批量测试,在一个小时左右的时间里它受到了多次攻击,因此它收到了数千个请求。当我查看 w3wp.exe(IIS 工作进程)时,内存不断增加,直到超过 5 GB,CPU 使用率接近 100%,然后最终 Web 服务停止工作。服务器有 16 GB RAM,我们刚刚从 8 GB 增加了它。5 GB 内存正常吗?这看起来很多,我本以为垃圾收集会更好地处理这个问题。我在使用性能监视器或其他东西来解决此类问题方面没有太多经验。
对我可以看的内容有什么建议吗?会不会有内存泄漏?当应用程序池达到一定的内存量时,我应该尝试让应用程序池回收吗?
更新 - 我们有另一个 .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;
}
}
最佳答案
激活对象中有什么?如果激活有许多子项,则在映射期间,它可能会尝试填充所有子项以及子项的子项,等等...如果您使用 EF 延迟加载,EF 将为每个子项群体创建一个子查询。
关于asp.net - 为什么 ASP.NET Web 服务占用如此多的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55710236/