您的驱动程序在 DPC 和 ISR 中花费了多少时间?
Updated: August 13, 2005
为了获得良好的系统性能,Windows 内核模式驱动程序应该将花在延迟过程调用 (Deferred Procedure Call, DPC) 和中断服务例程 (Interrupt Service Routine, ISR) 中的时间减小到最低。DPC 和 ISR 以高中断请求级别或 IRQL(分别为 DISPATCH_LEVEL 和设备 IRQL)运行。在 DPC 和 ISR 中花费太多时间的驱动程序会阻止系统服务线程,这降低了整体系统性能。驱动程序在 ISR 中花费的时间不应该超过 25 毫秒,在 DPC 中花费的时间不应该超过 100 毫秒。
可以使用 Tracelog 的新功能测量 Windows 内核模式驱动程序花费在 DPC 和 ISR 中的时间,Tracelog 是 Windows Driver Kit (WDK) 中提供的命令行工具,用来管理软件跟踪会话。Tracelog 的 DPC/ISR 功能捕获跟踪期间在内核中运行的所有驱动程序的活动,甚至是那些没有设置跟踪的驱动程序的活动。
Windows XP SP2 和更高版本的 Windows 都配置了 DPC/ISR 跟踪。但是,要实际地跟踪 DPC/ISR 活动,您需要在 Windows Vista 的 WDK 中和更高版本的 WDK 中提供的 Tracelog 版本。这个工具安装在 %winddk%\tools\tracing 文件夹中。
启动 DPC/ISR 跟踪会话
下列 Tracelog 命令启动一个 DPC/ISR 跟踪会话并将输出保存在 dpcisr.etl 事件跟踪日志文件中:
tracelog -start -f test01.etl -dpcisr -UsePerfCounter -b 64
在这个命令行中:
| • | tracelog -start 命令启动跟踪会话。“NT 内核记录程序”是默认的跟踪提供者,因此没有必要在命令中指定它,但是不能使用 -guid 参数指定提供者。 |
| • | -f 参数创建一个日志会话并将跟踪消息定向到 test01.etl 事件跟踪日志文件。 |
| • | -dpcisr 参数启用对 DPC、ISR、上下文切换和映像加载的跟踪。 |
| • | -UsePerfCounter 参数使用跟踪消息记录高分辨率性能计数器时钟的值,而不是低分辨率系统时间。因为系统计时器分辨率太低而无法测量花费在 DPC 和 ISR 中的时间,并且因为 Tracerpt(为 DPC/ISR 事件制定格式的工具)需要将性能计数器时钟值用于其报表,所以这是必需的。(Windows XP 和更高版本的 Windows 中包含 Tracerpt。) |
| • | -b 参数将跟踪缓冲区的大小增加到 64 KB。DPC/ISR 跟踪快速生成大量跟踪消息,因此如果跟踪缓冲区太小,就有可能“丢失”事件。还可能有必要使用 -max 参数来增加缓冲区的数目。(默认的缓冲区数目取决于处理器数目、物理内存量和使用的操作系统。) |
允许跟踪运行几分钟,并在跟踪运行期间试验驱动程序。报表中的统计数字是跟踪会话期间的平均值,因此如果想要模拟多个测试条件,那么请在单独的跟踪会话期间运行测试。要查看事件是否丢失,应定期发出 tracelog -q 命令。如有必要,使用 tracelog -update 来增加缓冲区大小或为跟踪会话添加更多缓冲区(例如 tracelog -update -b 128 -max 40)。
试验完驱动程序后,使用下列命令停止跟踪会话:
tracelog -stop
创建 DPC/ISR 跟踪报表
要总结事件跟踪日志中的 DPC/ISR 消息,请使用 Windows XP SP2 和更高版本的 Windows 中包含的 Tracerpt 版本。
下列 Tracerpt 命令设置 test01.etl 文件中消息的格式并创建 Windows XP SP2 中的活动的文本格式报表。
tracerpt test01.etl -report dpcisr.txt -df
在这个命令中:
| • | -report 参数指定分析方法和输出文件的名称 (dpcisr.txt)。 |
| • | 只有 Windows XP SP2 才需要 -df 参数来正确设置消息的格式。在 Windows Server 2003 SP1 和更高版本的 Windows 中,您可以使用 -f HTML 创建 HTML 格式的报表。 |
除了关于跟踪期间运行的每个进程的磁盘 I/O 的映像统计信息和数据外,DPC/ISR 事件跟踪会话报表还包含与 DPC 和 ISR 执行相关的信息,例如下面的信息:
| • | DPC 和 ISR 处理器占用率为跟踪中每个驱动程序花费在服务 DPC 和 ISR 例程上的处理器时间的百分比。 |
| • | 属于不同时间范围的 DPC 和 ISR 执行时间的分布,针对跟踪中的所有 DPC 和 ISR 例程以及单个例程的实例。 |
| • | 整个跟踪的单个 ISR 到 DPC 反应时间的分布,显示 ISR 结束到关联的 DPC 开始之间的延迟的时间间隔。 |
例如,下面是来自一个示例报表的摘要,显示 ipsec.sys 的 DPC 执行时间的分布。下界和上界列以毫秒为单位显示时间范围。报表显示这个驱动程序有超过一半的 DPC 例程运行时间在 100 到 250 毫秒之间,超出建议的阈值。
+------------------------------------------------------------------------------+ | 整个跟踪中 ipsec.sys(F7AA7449)DPC 执行时间的分布 | +------------------------------------------------------------------------------+ | 下界 上界 计数 百分比 | +------------------------------------------------------------------------------+ | 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% | +------------------------------------------------------------------------------+
关于 Tracelog 和 -dpcisr 参数的更多信息,请参见 Windows Driver Kit 文档中的 "Tracelog"。Tracelog 文档包含一个扩展的例子(“例子 15:测量 DPC/ISR 时间”),显示 DPC/ISR 跟踪过程的细节并解释 Tracerpt 生成的报表。
关于处理器的 IRQL 如何影响内核模式驱动程序的操作,请参见本技巧末尾处的“调度、线程上下文和 IRQL”。
您应该做什么?
| • | 使用带参数的 -dpcisr Tracelog 来查看您的驱动程序在 DPC 和 ISR 例程中花费了多少时间。 |
| • | 优化驱动程序的 DPC 和 ISR 例程,使其运行得尽可能快。 |
更多信息:
Windows Driver Kit (WDK)
WDK 的发布版本在 WHDC 上或通过 MSDN 订阅。
例子 15:测量 DPC/ISR 时间
事件跟踪
调度、线程上下文和 IRQL
多媒体平台上的设备 - 驱动程序性能注意事项