用户会经常抱怨自从安装自己的应用后,电脑开机变慢,到底是系统的原因还是应用的原因,为了了解这里的问题,探秘了下windows的开机过程和测试方法。 一、开机过程是怎样的 查看MSDN,微软将开机过程分为四个阶段:
1.BIOS初始化阶段 按上电源后,BIOS先进行硬件自检(POST),当检测到合法的操作系统分区,则完成硬件自检。读取MBR(主引导记录 Master boot record),启动Bootmgr.exe(Windows Bootmgr),并调用WinLoad.exe(Windows operating system loader),进入到osloader阶段。
其中Bootmgr.exe winload.exe是win7之后操作系统定义系统启动过程的组件。
2.OSLoader阶段 WinLoad.exe加载必要的系统驱动,当windows内核可执行时,则完成系统驱动的加载。这个阶段的驱动都是BOOT_START类型的(驱动的starttype是0)
3.MainPathBoot阶段 系统启动大部分工作集中在这个阶段。又将其细分为PreSMSS SMSSInit WinLogonInit Explorerinit 四个子阶段。
1)PreSMSS
WinLoad.exe调用内核,初始化内核,启动 PnP 管理器检查设备,加载并初始化设备驱动程序
2)SMSSInit
这个阶段是控制权从内核阶段移交给Smss.exe(session manager 进程),主要初始化视频驱动并启动子系统的Smss.exe, Csrss.exe, Wininit.exe, Winlogon.exe。
3)WinLogonInit
SCM启动自启动服务的工作在此阶段,登录界面出现,WinlogonInit结束后,桌面进程(Explorer)启动。
4)Explorerinit
创建桌面窗口管理器,初始化桌面,桌面首次出现,服务和应用程序都在这个阶段启动,是 CPU密集型阶段。
4.PostBoot阶段 用户可以与桌面进行交互,但系统仍然可能在启动服务,如托盘图标或应用程序在后台的代码等。这个阶段终止于系统合理的idle时间。其中Xbootmgr 它会每隔 100ms 去检测系统,如果系统 80%以上的时间是空闲的,则认为系统启动完成,并且该阶段会累积10秒的空闲时间才会结束(这就是为什么开机到完成时间需要调整减 10s)。
二、如何获取开机过程的数据 使用微软提供Xbootmgr来trace获取开机过程的数据。
1.安装工具 直接到微软MSDN去查找WPT,下载和安装。
2.环境的准备 不同的环境会影响开机时间,其中受影响主要以下几个方面:
1)bootprefetcher(开机预取)
见后面的预取说明,建议机器硬件配置是2G以上内存的,开启预取
2)networkconnections(网络的连接)
建议断网测试,屏蔽网络连接
3)log-onprocess(登录过程)
建议使用admin账号,不要用域账号,自动登录
4)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阶段的耗时 下是各个阶段的耗时,例如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
原文链接:http://tmq.qq.com/2016/11/windows_boot_explore/
关注我们的微信公众号查看完整内容哦~~~~
想知道更多测试相关干货 请关注我们的微信公众号:腾讯移动品质中心TMQ 二维码:
版权声明:腾讯TMQ拥有内容的全部版权,任何人或单位对本贴内容进行复制、转载时请申明原创腾讯tmq,否则将追究法律责任。