我有一个用Hangfire 1.7.8用DotnetCore 3.1编写的服务。我看到异常高的内存使用率,并且大多数内存被TimerQueueTimer对象占用,尽管我没有明确初始化任何Timer。
因为我最初是在Dotnetcore 2.2中创建的,所以它使用的是这样的旧服务结构:
internal class HangFireService : ServiceBase
{
}
在服务启动时以及任务完成时添加了这样的作业:
if(!_hangfireHelper.GetJobs(typeof(GenericTask), taskName).Any())
{
BackgroundJob.Schedule<GenericTask>(d => d.RunTask(null), TimeSpan.FromMinutes(5));
}
如何减少计时器的使用量?
最后证明,与Hangfire无关,但高内存使用率的根本原因是Serilog。
我创建了一个虚拟日志类,并将其注入到我的所有服务中,并且所有TimerQueueTimer对象都消失了。这是另一个memoryprofiler图像:
Serilog用法如下:
public Logger Logger()
{
var log = new LoggerConfiguration()
.ReadFrom.Configuration(_configuration)
.CreateLogger();
return log;
}
用法:
using( var log = Logger())
{
log.LogInformation(...)
}
以某种方式serilog没有处理计时器对象...