/ Performance,Windows / 195浏览

Windows 中如何获取开关机时间

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,表示没有执行。
BootSmssInitTimeSession Manager 子系统(SMSS.exe)初始化所花费的时间,这是用户态初始化的重要阶段之一。
BootCriticalServicesInitTime一些关键服务启动所需的时间,例如某些系统核心服务(RPC、事件日志、Plug and Play 服务等)。
BootUserProfileProcessingTime加载用户配置文件所用的时间,例如用户注册表 Hive 加载、用户环境变量应用等。
BootMachineProfileProcessingTime加载机器配置文件所用的时间,例如系统范围的环境变量、组策略等在初始化时的处理时长。
BootExplorerInitTimeExplorer.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 表示尚未识别。
OSLoaderDurationOS Loader(操作系统加载器)执行阶段的耗时,即从启动加载器(如 Boot Manager)到加载内核之前所花费的时间。
BootPNPInitStartTimeMS以毫秒为单位记录从开机开始到即将执行 PNP(Plug and Play)初始化的时间点。
BootPNPInitDurationPNP 初始化总时长,包括识别设备、分配资源、加载驱动等。
OtherKernelInitDuration其他内核初始化过程的时长,不包含已在 BootKernelInitTime、BootDriverInitTime、BootDevicesInitTime 中统计到的部分。
SystemPNPInitStartTimeMS系统级 PNP 初始化开始的时间点(相对于开机开始的毫秒数),通常在内核级完成后进一步处理。
SystemPNPInitDuration系统级 PNP 初始化所花费的时间,可能涉及到更多高级别的设备配置操作。
SessionInitStartTimeMSSession 初始化开始的时间点(相对于开机开始的毫秒数),涉及创建 Session 0、Session 1 等核心会话环境。
Session0InitDurationSession 0 初始化的时长,Session 0 是一个关键系统会话,负责系统服务等后台任务运行。
Session1InitDurationSession 1 初始化的时长,通常是本地控制台会话或第一个用户会话,影响到交互式登录。
SessionInitOtherDuration其他 Session 初始化过程所需的时长,可能涉及后台创建的其他会话或服务会话等。
WinLogonStartTimeMS从开机开始到 WinLogon(Windows 登录进程)启动的时间点(毫秒)。
OtherLogonInitActivityDuration登录过程中的其他初始化活动所花费的时间,例如加载策略、网络连接初始化等。
UserLogonWaitDuration用户在输入登录凭据后,等待进入桌面期间所消耗的时间。

简要分析

  1. BootTime 大致等于 (BootEndTime - BootStartTime)
  2. BootTime 可以被分成 MainPathBootTime + BootPostBootTime 这两个大的阶段。
  3. MainPathBootTime 包含 核心驱动和设备初始化、Session Manager(SMSS.exe)初始化、WinLogon/用户会话初始化等关键步骤。但不包括在 Explorer.exe 加载完成后、系统在后台继续加载的各种延迟启动非关键启动项的时间(这部分会统计在 PostBootTime 中)
  4. 其余字段多是分段耗时或标志位,可能存在一定的交叉或重叠。

由于开机流程中存在多线程并行、异步初始化(例如服务、驱动、进程等同时进行),并且系统记录时可能会在不同的事件点采样,因此并不是所有字段都能用一个“加法公式”严丝合缝地对上。相互之间更适合用来做趋势分析定位瓶颈,而非做绝对数值的严谨对比。

Windows是如何区分互联网下载文件和本地文件的
Windows是如何区分互联网下载文件和本地文件的
如何低成本的获取到应用卡顿情况
如何低成本的获取到应用卡顿情况
【译】ETW 堆跟踪 – 每个分配都被记录
【译】ETW 堆跟踪 – 每个分配都被记录
【译】Wait Analysis – 寻找空闲时间
【译】Wait Analysis – 寻找空闲时间
如何通过 ETW Provider 来记录应用日志
如何通过 ETW Provider 来记录应用日志
如何通过 C++ 实时监听 ETW 事件
如何通过 C++ 实时监听 ETW 事件

0

  1. This post has no comment yet

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注