/ Performance,Windows / 70浏览

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. 其余字段多是分段耗时或标志位,可能存在一定的交叉或重叠。

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

如何通过 C++ 实时监听 ETW 事件
如何通过 C++ 实时监听 ETW 事件
【译】调查并确定 Windows 运行速度变慢问题
【译】调查并确定 Windows 运行速度变慢问题
【译】丢失的 WPA 文档 —— 磁盘使用
【译】丢失的 WPA 文档 —— 磁盘使用
【译】丢失的 WPA 文档 —— CPU 调度
【译】丢失的 WPA 文档 —— CPU 调度
【译】丢失的 WPA 文档 —— CPU 采样
【译】丢失的 WPA 文档 —— CPU 采样
如何通过 PDH(Performance Data Helper) 获取性能计数器的值

0

  1. This post has no comment yet

发表回复

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