Windows 上,开关机时间对用户体验影响非常大。获取到每次开机总时间和阶段耗时,有利于我们了解系统瓶颈,方便后续进行改善。
借助于 Windows 强大的诊断能力,Windows 自身借助 ETW 就已经统计了开关机的时间,这样我们获取开关机时间就非常简单了。
具体的数据就在 Microsoft-Windows-Diagnostics-Performance/Operational
这个 Provider 里了。
接下来,我们看看具体的信息
关机时间
针对关机时间,其会通过事件 ID 为 200
的一个事件来将中间过程汇总:
打开事件查看器,找到 Microsoft-Windows-Diagnostics-Performance/Operational
中的一个 200 的事件:
详情中,我们可以看到 EventData 中包含多个字段。以下是关于这些字段的解释:
字段名 | 含义 |
ShutdownTsVersion | 事件数据结构的版本号,用于区分不同版本的 Windows 中可能的事件结构差异。 |
ShutdownStartTime | 关机流程开始的时间(UTC 时间戳),表示系统正式进入关机过程的起点。 |
ShutdownEndTime | 关机流程结束的时间(UTC 时间戳),表示系统完成关机或即将断电重启的时间点。 |
ShutdownTime | 从关机开始到结束所花费的总时间(毫秒),可视为 (ShutdownEndTime - ShutdownStartTime) 的数值表示。 |
ShutdownUserSessionTime | 关闭用户会话所花费的时间,包括注销用户时的数据写回、断开会话等过程的耗时。 |
ShutdownUserPolicyTime | 关闭用户策略(User Policy)所耗的时间,可能与组策略或用户层面设置的卸载相关。 |
ShutdownUserProfilesTime | 卸载用户配置文件(User Profiles)所用的时间,如注册表蜂窝写回、用户配置清理等。 |
ShutdownSystemSessionsTime | 关闭系统会话(System Sessions)所消耗的时间,一般指系统层面服务或会话对象的清理、回收。 |
ShutdownPreShutdownNotificationsTime | 发出预关机通知(SERVICE_CONTROL_PRESHUTDOWN 等)并等待各服务响应所花费的时间。 |
ShutdownServicesTime | 停止所有正在运行服务所用的时间,包括等待它们退出、释放资源等过程。 |
ShutdownKernelTime | 关闭内核阶段的耗时,包括终止进程、卸载驱动程序、处理核心组件停止等。 |
ShutdownRootCauseStepImprovementBits | 以位掩码形式表示是否检测到关机性能“一步到位式”改进;0 表示无改进。 |
ShutdownRootCauseGradualImprovementBits | 以位掩码形式表示是否检测到关机性能“逐步式”改进;0 表示无改进。 |
ShutdownRootCauseStepDegradationBits | 以位掩码形式表示是否检测到关机性能一次性恶化;大于 0 表示系统检测到具体退化。 |
ShutdownRootCauseGradualDegradationBits | 以位掩码形式表示是否检测到关机性能逐步性恶化;大于 0 表示系统检测到逐步退化。 |
ShutdownIsDegradation | 若为 true ,表示系统判断这次关机比基准更慢,存在性能退化。 |
ShutdownTimeChange | 若不为 0 ,表示关机时间统计上可能因系统时间调整等因素而进行修正;0 表示未检测到。 |
开机时间
针对关机时间,其会通过事件 ID 为 100
的一个事件来将中间过程汇总:
打开事件查看器,找到 Microsoft-Windows-Diagnostics-Performance/Operational
中的一个 200 的事件:
详情中,我们可以看到 EventData 中包含多个字段。以下是关于这些字段的解释:
字段名 | 含义 |
BootTsVersion | 事件数据结构的版本号,用于区分不同版本的 Windows 中可能的事件结构差异。 |
BootStartTime | 开机流程开始的时间(UTC 时间戳),表示系统正式进入开机过程的起点。 |
BootEndTime | 开机流程结束的时间(UTC 时间戳),表示系统已加载完必要组件、进入可供用户交互的状态时间点。 |
SystemBootInstance | 记录系统层面的开机序号,每次系统启动会自增,用于区分第几次开机(系统范围)。 |
UserBootInstance | 记录用户层面的开机序号,每次用户登录后的开机会自增,用于区分第几次开机(用户范围)。 |
BootTime | 从开机开始到完成的总耗时,单位为毫秒,一般可视作 (BootEndTime - BootStartTime) 的数值。 |
MainPathBootTime | 主路径开机阶段的耗时,主要包含从内核启动到关键服务(如 Session Manager)初始化结束的这一段时间,通常是系统可交互前的关键开机时间。 |
BootKernelInitTime | 内核初始化阶段所花费的时间,包含加载内核本身、初始化核心数据结构、调度器等。 |
BootDriverInitTime | 驱动程序初始化所花费的时间,包括加载必要驱动、执行驱动初始化例程等。 |
BootDevicesInitTime | 设备初始化所需的时间,通常指操作系统识别并初始化各类硬件设备的过程。 |
BootPrefetchInitTime | 预取(Prefetch)初始化所花费的时间,有助于加快读取常用文件或数据,但此字段可能为 0 表示未启用或时长极短。 |
BootPrefetchBytes | 预取读取的字节数,若为 0,表示未进行预取或者捕捉不到该数据。 |
BootAutoChkTime | 系统在开机时是否执行了自动磁盘检查(chkdsk)的时间,正常情况下为 0,表示没有执行。 |
BootSmssInitTime | Session Manager 子系统(SMSS.exe)初始化所花费的时间,这是用户态初始化的重要阶段之一。 |
BootCriticalServicesInitTime | 一些关键服务启动所需的时间,例如某些系统核心服务(RPC、事件日志、Plug and Play 服务等)。 |
BootUserProfileProcessingTime | 加载用户配置文件所用的时间,例如用户注册表 Hive 加载、用户环境变量应用等。 |
BootMachineProfileProcessingTime | 加载机器配置文件所用的时间,例如系统范围的环境变量、组策略等在初始化时的处理时长。 |
BootExplorerInitTime | Explorer.exe(Windows Shell)初始化的耗时,用户桌面环境启动和图形界面可交互前的关键步骤之一。 |
BootNumStartupApps | 随开机自动启动的应用程序数量统计。 |
BootPostBootTime | 主路径开机完成后,系统在后台继续加载的一些非关键任务或其他应用所花费的时间。如服务、启动项在主线程之外进行的初始化时长。 |
BootIsRebootAfterInstall | 若为 true ,表示这次开机是因某些安装(系统更新或应用安装)后的自动重启;为 false 则表示普通的开机流程。 |
BootRootCauseStepImprovementBits | 以位掩码形式表示是否检测到开机性能“一步到位式”改进;0 表示无改进。 |
BootRootCauseGradualImprovementBits | 以位掩码形式表示是否检测到开机性能“逐步式”改进;0 表示无改进。 |
BootRootCauseStepDegradationBits | 以位掩码形式表示是否检测到开机性能一次性恶化;大于 0 表示系统检测到具体退化。 |
BootRootCauseGradualDegradationBits | 以位掩码形式表示是否检测到开机性能逐步恶化;大于 0 表示系统检测到逐步退化。 |
BootIsDegradation | 若为 true ,表示系统判断本次开机相比基准更慢,存在性能退化。 |
BootIsStepDegradation | 若为 true ,表示开机性能出现明显的一次性退化(步骤性、突增式变慢)。 |
BootIsGradualDegradation | 若为 true ,表示开机性能出现逐步式退化(逐渐变慢)。 |
BootImprovementDelta | 当出现性能提升时,这里会显示相对于基准的改进值;为 0 表示没有变化。 |
BootDegradationDelta | 当出现性能下降时,这里会显示相对于基准的退化值;为 0 表示没有变化。 |
BootIsRootCauseIdentified | 若为 true ,表示系统已经识别到具体导致开机变慢或变快的根本原因,false 表示尚未识别。 |
OSLoaderDuration | OS Loader(操作系统加载器)执行阶段的耗时,即从启动加载器(如 Boot Manager)到加载内核之前所花费的时间。 |
BootPNPInitStartTimeMS | 以毫秒为单位记录从开机开始到即将执行 PNP(Plug and Play)初始化的时间点。 |
BootPNPInitDuration | PNP 初始化总时长,包括识别设备、分配资源、加载驱动等。 |
OtherKernelInitDuration | 其他内核初始化过程的时长,不包含已在 BootKernelInitTime、BootDriverInitTime、BootDevicesInitTime 中统计到的部分。 |
SystemPNPInitStartTimeMS | 系统级 PNP 初始化开始的时间点(相对于开机开始的毫秒数),通常在内核级完成后进一步处理。 |
SystemPNPInitDuration | 系统级 PNP 初始化所花费的时间,可能涉及到更多高级别的设备配置操作。 |
SessionInitStartTimeMS | Session 初始化开始的时间点(相对于开机开始的毫秒数),涉及创建 Session 0、Session 1 等核心会话环境。 |
Session0InitDuration | Session 0 初始化的时长,Session 0 是一个关键系统会话,负责系统服务等后台任务运行。 |
Session1InitDuration | Session 1 初始化的时长,通常是本地控制台会话或第一个用户会话,影响到交互式登录。 |
SessionInitOtherDuration | 其他 Session 初始化过程所需的时长,可能涉及后台创建的其他会话或服务会话等。 |
WinLogonStartTimeMS | 从开机开始到 WinLogon(Windows 登录进程)启动的时间点(毫秒)。 |
OtherLogonInitActivityDuration | 登录过程中的其他初始化活动所花费的时间,例如加载策略、网络连接初始化等。 |
UserLogonWaitDuration | 用户在输入登录凭据后,等待进入桌面期间所消耗的时间。 |
简要分析:
- BootTime 大致等于 (BootEndTime - BootStartTime)
- BootTime 可以被分成 MainPathBootTime + BootPostBootTime 这两个大的阶段。
- MainPathBootTime 包含 核心驱动和设备初始化、Session Manager(SMSS.exe)初始化、WinLogon/用户会话初始化等关键步骤。但不包括在 Explorer.exe 加载完成后、系统在后台继续加载的各种延迟启动或非关键启动项的时间(这部分会统计在 PostBootTime 中)
- 其余字段多是分段耗时或标志位,可能存在一定的交叉或重叠。
由于开机流程中存在多线程并行、异步初始化(例如服务、驱动、进程等同时进行),并且系统记录时可能会在不同的事件点采样,因此并不是所有字段都能用一个“加法公式”严丝合缝地对上。相互之间更适合用来做趋势分析或定位瓶颈,而非做绝对数值的严谨对比。
0