Windows开机过程和测试方法探索

用户会经常抱怨自从安装自己的应用后,电脑开机变慢,到底是系统的原因还是应用的原因,为了了解这里的问题,探秘了下windows的开机过程和测试方法。

一、开机过程是怎样的

查看MSDN,微软将开机过程分为四个阶段

1BIOS初始化阶段

按上电源后,BIOS先进行硬件自检(POST),当检测到合法的操作系统分区,则完成硬件自检。读取MBR(主引导记录 Master boot record),启动Bootmgr.exe(Windows Bootmgr),并调用WinLoad.exe(Windows operating system loader),进入到osloader阶段。

其中Bootmgr.exe winload.exe是win7之后操作系统定义系统启动过程的组件。

2OSLoader阶段

WinLoad.exe加载必要的系统驱动,当windows内核可执行时,则完成系统驱动的加载。这个阶段的驱动都是BOOT_START类型的(驱动的starttype是0)

3MainPathBoot阶段

系统启动大部分工作集中在这个阶段。又将其细分为PreSMSS SMSSInit WinLogonInit Explorerinit 四个子阶段

  • PreSMSS

WinLoad.exe调用内核,初始化内核,启动 PnP 管理器检查设备,加载并初始化设备驱动程序

  • SMSSInit

这个阶段是控制权从内核阶段移交给Smss.exe(session manager 进程),主要初始化视频驱动并启动子系统的Smss.exe, Csrss.exe, Wininit.exe, Winlogon.exe。

  • WinLogonInit

SCM启动自启动服务的工作在此阶段,登录界面出现,WinlogonInit结束后,桌面进程(Explorer)启动。

  • Explorerinit

创建桌面窗口管理器,初始化桌面,桌面首次出现,服务和应用程序都在这个阶段启动,是 CPU密集型阶段。

4PostBoot阶段

用户可以与桌面进行交互,但系统仍然可能在启动服务,如托盘图标或应用程序在后台的代码等。这个阶段终止于系统合理的idle时间。其中Xbootmgr 它会每隔 100ms 去检测系统,如果系统 80%以上的时间是空闲的,则认为系统启动完成,并且该阶段会累积10秒的空闲时间才会结束(这就是为什么开机到完成时间需要调整减 10s)。

二、如何获取开机过程的数据

使用微软提供Xbootmgr来trace获取开机过程的数据。

1安装工具

直接到微软MSDN去查找WPT,下载和安装。

2环境的准备

不同的环境会影响开机时间,其中受影响主要以下几个方面:

  • bootprefetcher(开机预取)

见后面的预取说明,建议机器硬件配置是2G以上内存的,开启预取

  • networkconnections(网络的连接)

建议断网测试,屏蔽网络连接

  • log-onprocess(登录过程)

建议使用admin账号,不要用域账号,自动登录

  • user interactions(用户的交互)

trace数据过程中不要进行操作

3基准版本

为了对比开机过程,基准系统是很重要,所以测试影响开机启动时间时,先跑干净环境,获取基准数据。如下图:微软不同硬件配置开机时间。线下自己验证基准系统的时间是20S

配置同下面表中第三个。

4使用并抓取开机过程数据

1)使用UI界面抓取,如下图,选择boot,勾选事件,点击start即可

2)使用命令行

xbootmgr-trace boot -numRuns 3 -resultPath %systemdrive%\traces -postBootDelay 180-traceFlags latency+dispatcher -stackWalk Profile+CSwitch+ReadyThread–prepsystem

  • 其中-numRuns 测试次数,-resultPath 结果etl保存路径;
  • –postBootDelay每次测试时间间隔(微软建议时间间隔是180S);
  • -prepsystem使用预取功能(重启6次后,完成开机的预取之后的数据才稳定)。
  • 预取功能是优化预读文件,提高系统开关机速度。默认win7之后的OS预取都是开启的,查看注册表system下EnableSuperfetch 和EnablePrefetcher ,如果设置为"0",不使用预读功能;设置为"1",系统将只预读应用程序; 设置为"2",系统将只预读Windows系统文件;设置为"3",系统将预读Windows系统文件和应用程序(默认值)。这些预取文件保存在C:\Windows\Prefetch。
  • 对比使用预取和未使用数据有差别

三、分析开机过程

1将抓取的etl转成xml格式

可明确看到各个阶段的耗时

xperf -i boot_1.etl -o Summary.xml -a boot

1)其中-i对应etl的名字,-o输出xml的名字

2打开对应的xml,大致分析各个阶段的耗时

1)所有时间单位是msec(毫秒)

2)字段解析

  • bootDoneViaExplorer:开机到桌面的时间
  • bootDoneViaPostBoot:开机完成的时间,需要减去10S(见上面的说明)
  • osLoaderDuration:osLoader阶段的耗时
  • <interval>下是各个阶段的耗时,例如preSMSS的durantion是3672ms。其中TraceTail是开机完成后,trace数据的时间,一般忽略。
  • 如果觉得哪个阶段的耗时增加,可展开对应的节点。
  • 大家可能疑问这里为什么没有BIOS初始化阶段,主要由于这个阶段xbootmgr是从osloader阶段获取相应的etw事件,所以bios阶段时间无法获取。

3分阶段分析开机过程的时间消耗是否合理

1)osLoader阶段影响点:

这个阶段可能导致的性能瓶颈是驱动签名的验证。驱动有两个签名的方式(catalog signing 和 embeddedsigning),而catalogsiging的方式,经过验证delay osLoader阶段1到3S,所以建议这个阶段的系统驱动都是embedded signing。验证方法如下:

  • xperf -i trace.etl -o trace.txt-a dumper

findstr /C:"I-DCStart" trace.txt 如下就是在osloader阶段的驱动

  • 使用微软的签名工具验证signtool verify /v driver.sys

2)PreSMSS阶段影响点

这个阶段主要影响点是PNP设备,因实际的产品没有新增PNP,无案例。可参考看PNP各个阶段的耗时

3)SMSSInit阶段的影响点

此阶段受视频驱动的影响,所以将视频驱动更新到最新版本。可提高开机速度。实际产品也没有涉及到这个点,无案例。

4)WinLogonInit阶段的影响点

此阶段CPU和IO都是需求很大,主要查看自启动服务的耗时是否影响。其中totalTransitionTimeDelta服务的延时时间

5)Explorerinit和PostBoot阶段的影响点

此阶段会受自启动有应用和服务的影响,可配合WPA工具查看

  • 用wpa工具打开etl,如下图。配合BootPhases可查看各个阶段启动的exe和服务的耗时、CPU、IO等。具体见以后案例

四、开机性能测试建议

1方法

1)一般判断应用是否影响到开机时间,可先跑无应用系统与有应用的系统

2)对比两者数据的差别,判断出问题的阶段

3)针对有问题的阶段配合WPA工具查看具体驱动或服务是否合理,开机完成后

应用程序自启动的逻辑是否影响到开机后的操作。

2微软开机性能tips,结合日常设计驱动、服务、应用程序注意点

1)服务

【开发设计原则】:

除非有必要,尽量不要设计开机启动服务,服务尽量按需启动或触发启动;

服务不要设计加载顺序;

服务运行时尽可能及时报告当前状态;

服务启动代码避免用托管代码(CLR);

【性能点】:

是否开机启动服务,评估开机服务会增加多少开机时间

2)驱动

【开发设计原则】:

驱动尽量用WDF编写;

开机启动驱动签名是Embedded_sign;

除非有必要,尽量不要设计开机启动驱动;

非内核驱动,初始化IRPs,返回STATUS_PENDING;

驱动的配置信息放在注册表的system下,会比放在software下节省开机时间

控制驱动文件的大小

【性能点】:

是否是开机驱动,会增加多少开机时间

3)应用程序

【开发设计原则】:

自启动应用,应减少对开机资源的消耗(规范其启动后对于DISK和CPU的占用);

应用程序的启动代码避免用托管代码(CLR);

自启动注册表不要用RunOnce;

【性能点】:

是否开机启动应用,开机启动应用增加多少开机时间

参考的文档:http://www.microsoft.com/whdc/system/pnppwr/powermgmt/OnOffTrans.mspx

原文发布于微信公众号 - 腾讯移动品质中心TMQ(gh_2052d3e8c27d)

原文发表时间:2016-11-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏云加头条

腾讯云服务器配置不用愁 只需这几步

作为云计算服务的重要组成部分,云服务器以其简单高效、安全可靠、弹性扩展的特性成为核心力量,构建了包括计算、网络、存储在内的综合服务平台。以腾讯云服务器为例,CV...

23.3K7
来自专栏IT技术精选文摘

架构师眼中的高并发架构

2475
来自专栏青青天空树

分布式事务1

  分布式事务是企业集成中的一个技术难点,也是每一个分布式系统架构中都会涉及到的一个东西,特别是在微服务架构中,几乎是无法避免的。

1533
来自专栏最高权限比特流

使用linux服务器安装wordpress博客详细教程

3363
来自专栏finleyMa

(转) 网站统计中的数据收集原理及实现

原文地址:http://blog.codinglabs.org/articles/how-web-analytics-data-collection-syste...

2011
来自专栏Golang语言社区

Golang协程与通道整理

协程goroutine 不由OS调度,而是用户层自行释放CPU,从而在执行体之间切换。Go在底层进行协助实现 涉及系统调用的地方由Go标准库...

3617
来自专栏一名合格java开发的自我修养

交易系统使用storm,在消息高可靠情况下,如何避免消息重复

概要:在使用storm分布式计算框架进行数据处理时,如何保证进入storm的消息的一定会被处理,且不会被重复处理。这个时候仅仅开启storm的ack机制并不能解...

953
来自专栏Golang语言社区

Golang协程与通道整理

协程goroutine 不由OS调度,而是用户层自行释放CPU,从而在执行体之间切换。Go在底层进行协助实现 涉及系统调用的地方由Go标准库...

2697
来自专栏Timhbw博客

Windows下iOS开发环境搭建教程

2016-06-1513:59:42 发表评论 2,027℃热度 1.下载工具 2.安装基本文件 3.开始主要步骤 4.总结 目录 可能许多初学者并没...

1.1K8
来自专栏知晓程序

【好文回顾】小程序想要「任性推送」模板消息?这个办法可以一试!

「模板消息」能力,几乎是小程序唯一可以向用户主动推送消息的渠道。有了它,小程序就可以向用户发送重要的消息通知。

1082

扫码关注云+社区

领取腾讯云代金券