事件计数器

Entity Framework Core (EF Core) 公开连续的数字指标,这些指标可以很好地指示程序的运行状况。 这些指标可用于以下目的:

  • 在应用程序运行时实时跟踪一般数据库负载
  • 公开可能导致性能下降的有问题的编码做法
  • 追踪并隔离异常的程序行为

EF Core 通过标准的 .NET 事件计数器功能报告指标;建议阅读博客文章,快速了解计数器的工作原理。

使用 dotnet-counters 附加到进程

dotnet-counters 工具可附加到正在运行的进程并定期报告 EF Core 事件计数器;无需在程序中执行任何特别操作即可使用这些计数器。

首先,安装 dotnet-counters 工具:dotnet tool install --global dotnet-counters

接下来,找到运行 EF Core 应用程序的 .NET 进程的进程 ID (PID):

  1. 右键单击任务栏并选择“任务管理器”,打开 Windows 任务管理器。
  2. 确保已选中窗口底部的“更多详细信息”选项。
  3. 在“进程”选项卡中,右键单击某一列并确保已启用 PID 列。
  4. 在进程列表中找到你的应用程序,并从 PID 列中获取其进程 ID。

在 .NET 应用程序中,进程 ID 以 Process.GetCurrentProcess().Id 的形式提供;这对于在启动时打印 PID 非常有用。

最后,按如下方式启动 dotnet-counters

dotnet counters monitor Microsoft.EntityFrameworkCore -p <PID>

dotnet-counters 现在将附加到正在运行的进程并开始报告连续的计数器数据:

Press p to pause, r to resume, q to quit.
 Status: Running

[Microsoft.EntityFrameworkCore]
    Active DbContexts                                               1
    Execution Strategy Operation Failures (Count / 1 sec)           0
    Execution Strategy Operation Failures (Total)                   0
    Optimistic Concurrency Failures (Count / 1 sec)                 0
    Optimistic Concurrency Failures (Total)                         0
    Queries (Count / 1 sec)                                         1
    Queries (Total)                                               189
    Query Cache Hit Rate (%)                                      100
    SaveChanges (Count / 1 sec)                                     0
    SaveChanges (Total)                                             0

计数器及其含义

计数器名称 说明
活动 DbContexts
(active-db-contexts)
当前应用程序中活动的且未释放的 DbContext 实例的数量。 如果此数字持续增长,则可能出现了遗漏,因为 DbContext 实例未受到正确释放。 请注意,如果已启用上下文池,则此数字包括当前未使用的池化 DbContext 实例。
执行策略操作失败
total-execution-strategy-operation-failuresexecution-strategy-operation-failures-per-second
数据库操作执行失败的次数。 如果已启用重试执行策略,则这包括多次尝试同一操作时的每一次失败。 这可用于检测基础结构的瞬态问题。
乐观并发失败
total-optimistic-concurrency-failuresoptimistic-concurrency-failures-per-second
SaveChanges 因乐观并发错误(因为代码加载数据存储中的数据时该数据发生了更改)而失败的次数。 这对应于引发的 DbUpdateConcurrencyException
查询
total-queriesqueries-per-second
执行的查询数。
查询缓存命中率 (%)
(compiled-query-cache-hit-rate)
查询缓存命中与未命中的比率。 EF Core 首次执行指定的 LINQ 查询(不包括参数)时,必须在相对繁重的进程中对其进行编译。 在普通的应用程序中,所有查询都是重用的,并且在初始预热阶段后,查询缓存命中率应稳定在 100%。 如果此数字随着时间的推移低于 100%,则性能可能因重复编译而下降,这可能是次优动态查询生成的结果。
SaveChanges
total-save-changessave-changes-per-second
SaveChanges 的调用次数。 请注意,SaveChanges 在单批中保存多个更改,因此这不一定代表在单个实体上完成的每一个更新。

其他资源