示例 15:测量 DPC/ISR 时间

通过跟踪 Windows 内核中的延迟过程调用 (DPC) 和中断服务例程 (ISR),可以测量驱动程序在这些事件中花费的时间。 这些信息将帮助您最大限度地减少驱动程序在较高 IRQL 上花费的时间,从而提高驱动程序和系统的效率。

Microsoft 建议,DPC 的运行时间不应超过 100 微秒,ISR 的运行时间不应超过 25 微秒。 有关最新要求,请参阅 硬件实验套件

本节介绍的程序包括以下步骤:

  1. 启动 DPC/ISR 事件的内核跟踪。

  2. 监控跟踪会话中丢失的事件,必要时增加跟踪缓冲区的大小。

  3. 测试驱动程序。

  4. 停止跟踪会话。

  5. 使用 Tracerpt 生成报告,汇总 DPC/ISR 活动。

  6. 分析报告

步骤 1:开始跟踪会话。

以下命令将启动 NT 内核记录器跟踪会话:

tracelog -start -f test01.etl -dpcisr -UsePerfCounter -b 64

tracelog -start 命令启动跟踪会话。 由于“NT 内核记录器”是默认会话名称,因此无需指定,也不能使用 -guid 参数指定提供程序文件。 该命令使用 -f 参数指示日志会话,并将跟踪信息导入 test01.etl 事件跟踪日志文件。

该命令包含 -dpcisr 参数,用于启用对 DPC、ISR、上下文切换和映像加载的跟踪。

跟踪 DPC 和 ISR 时,请务必在命令中添加 -UsePerfCounter 参数。 系统计时器的分辨率太低,无法测量这些活动所花费的时间。 此外,格式化 DPC/ISR 事件的工具 Tracerpt 也需要性能计数器时钟值来生成报告。 (Tracerpt 包含在 Windows XP 和更高版本的 Windows 中)。

最后,该命令使用 -b 参数将跟踪缓冲区的大小增至 64 KB。 由于 DPC/ISR 跟踪会快速生成大量跟踪信息,因此必须增加跟踪缓冲区的大小,以免丢失事件。

作为对该命令的响应,Tracelog 会启动 NT 内核记录器会话并显示其属性。

Logger Started...
Operation Status:       0L      The operation completed successfully.

Logger Name:            NT Kernel Logger
Logger Id:              ffff
Logger Thread Id:       00000C18
Buffer Size:            64 Kb
Maximum Buffers:        25
Minimum Buffers:        3
Number of Buffers:      5
Free Buffers:           4
Buffers Written:        14
Events Lost:            0
Log Buffers Lost:       0
Real Time Buffers Lost: 0
AgeLimit:               15
Log File Mode:          Sequential
Enabled tracing:        Process Thread Disk File ImageLoad
Log Filename:           c:\Tracelog\test01.etl

请注意,DPC、ISR 和上下文切换事件不会出现在 Enabled tracing 显示字段中。 由于这些事件由内部仪器监控,因此即使启用了这些事件,它们也不会出现在此列表中。 不过,图像加载事件(也可通过 -dpcisr 参数启用)确实会出现。

步骤 2:检查丢失的事件。

定期使用 tracelog -q (查询)命令检查丢失的事件。 如果发现它们,请使用 tracelog -update 命令向跟踪会话添加更多缓冲区。

tracelog -q

tracelog -q 命令需要会话名称,但在本例中无需提供,因为“NT 内核记录器”是默认名称。

作为对该命令的响应,Tracelog 会显示会话的属性。

Operation Status:       0L      The operation completed successfully.

Logger Name:            NT Kernel Logger
Logger Id:              ffff
Logger Thread Id:       00000BC4
Buffer Size:            64 Kb
Maximum Buffers:        25
Minimum Buffers:        3
Number of Buffers:      25
Free Buffers:           23
Buffers Written:        571
Events Lost:            544
Log Buffers Lost:       0
Real Time Buffers Lost: 0
AgeLimit:               15
Log File Mode:          Sequential
Enabled tracing:        Process Thread Disk File ImageLoad
Log Filename:           c:\Tracelog\test.etl

在这种情况下,生成的 544 个事件没有保存在缓冲区中。 要防止这种情况再次发生,可使用 tracelog -update 命令增加每个缓冲区的大小 (-b) 或增加缓冲区的最大数量 (-max) 等:

tracelog -update -b 128 -max 40

步骤 3:锻炼驾驶员。

使用测试例程使驱动程序执行其功能。 考虑运行两个测试,一个测试基本功能,另一个测试更高级的功能。

步骤 4:停止跟踪会话。

使用以下命令停止跟踪会话:

tracelog -stop

tracelog -stop 命令通常需要会话名称,但由于“NT 内核记录器”是默认设置,因此不需要会话名称。

步骤 5:创建 DPC/ISR 报告。

要汇总事件跟踪日志中的 DPC/ISR 消息,请使用 Windows XP SP2 及更高版本 Windows 中包含的 Tracerpt 版本。

以下 Tracerpt 命令格式化了 Test01.etl 文件中的信息,并在装有 SP2 的 Windows XP 中创建了文本格式的活动报告。

tracerpt test01.etl -report dpcisr.txt -df

在该命令中, -report 参数指定了分析方法和输出文件的名称。 只有在带 SP2 的 Windows XP 中,才需要使用 -df 参数来正确格式化报文。

在带 SP1 的 Windows Server 2003 和更高版本的 Windows 中创建此报告时,可使用以下命令创建 HTML 格式的报告。

tracerpt test01.etl -report dpcisr.html -f HTML

在该命令中, -report 参数指定输出文件的名称, -f 参数指定报告格式。

步骤 6:分析报告。

Windows 事件跟踪会话报告 "包含以下部分:

  • 图像统计。 显示跟踪期间计算机上运行的进程数据。

  • 磁盘总数。 显示跟踪期间运行的每个进程的磁盘 I/O 数据。

  • 整个轨迹的 DPC 处理器利用率:显示每个驱动程序用于 DPC 例程的处理器时间百分比。

  • 整个跟踪过程中所有 DPC 执行时间的分布。 以微秒为单位的时间范围表。 该表显示了每个时间范围内 DPC 例程的百分比。

  • 整个跟踪中 DriverName ( DPCRoutineAddress ) DPC 执行时间的分布。 以微秒为单位的时间范围表。 该表显示了该 DPC 例程在每个时间范围内的实例百分比。 跟踪中的每个 DPC 例程都会出现类似这样的部分。

  • 整个跟踪过程中 ISR 处理器的利用率。 显示跟踪中每个驱动程序用于中断服务例程的处理器时间百分比。

  • 整个跟踪的所有 ISR 执行时间分布。 以微秒为单位的时间范围表。 该表显示了每个时间范围内 ISR 例程的百分比。

  • 整个跟踪过程中驱动程序名称 ( ISRAddress ) ISR 执行时间的分布。 以微秒为单位的时间范围表。 该表显示 ISR 实例在每个时间范围内的百分比。 跟踪中的每个 ISR 都会出现类似这样的部分。

  • TracingPeriodInMs 两个微秒时间窗口的 DPC 和 ISR 处理器利用率分布。 显示跟踪期间 DPC 和 ISR 的综合处理器利用率。

  • 整个跟踪中从 DriverName ( ISRAddress ) ISR 到 DriverName ( DPCRoutineAddress ) DPC 延迟的分布。 显示 ISR 结束与相关 DPC 开始之间延迟时间间隔的分布。

下面的示例报告节选显示了 Ipsec.sys 的 DPC 执行时间分布。 一般来说,不鼓励使用超过 100 微秒的 DPC 例程。 报告显示,该驱动程序的半数以上 DPC 例程都超过了阈值。

+------------------------------------------------------------------------------+
| Distribution of ipsec.sys (F7AA7449) DPC execution times for the whole trace |
+------------------------------------------------------------------------------+
| Lower Bound         Upper Bound            Count             Percent         |
+------------------------------------------------------------------------------+
|           0                   1                0                0.00%        |
|           1                   2                0                0.00%        |
|           2                   3                8               42.11%        |
|           3                   4                1                5.26%        |
|           4                   5                0                0.00%        |
|           5                  10                0                0.00%        |
|          10                  25                0                0.00%        |
|          25                  50                0                0.00%        |
|          50                 100                0                0.00%        |
|         100                 250               10               52.63%        |
+------------------------------------------------------------------------------+
|                                               19              100.00%        |
+------------------------------------------------------------------------------+