记一次Windows开机启动优化

记一次Windows开机启动优化

问题

公司的老爷机没有固态硬盘,开机慢得令人发指。最近一次自动更新,在登录界面转圈转了近十分钟。忍无可忍,遂尝试优化。

虽然公司机器上装了各种EDR、监控软件,但并不代表优化是不可能的。优化第一步当然是找关键路径了。提到OS的启动流程,大部分人(包括我一开始)都会想到BIOSUEFI之类晦涩难懂的东西。然而机器启动时在登陆界面转了老半天,说明主要关注对象不是UEFI等底层模块。换句话说,能看到登录界面,说明OS初始化已经完成了,许多建立在OS上的工具此时都能工作。

我们需要OS启动阶段的日志,包括每一步的开始、结束时间、此时运行哪些进程、各类硬件使用率等信息,由此才能找到是谁吃掉了那么长的时间。与Linux打印大量日志不同,Windows通过内置的事件引擎记录这些信息。用Windows Performance Analyzer先抓一组数据:

WPR配置

我把Detail Level设成了Light,因为Verbose数据量太大,真会让机子半小时都起不来;Number of Iterations设置成1,因为一组数据确实够了,这转圈问题百分百复现。配置完后会自动提示重启。

抓到数据后,配置ProfileFullBoot.Boot.wpaProfile,便于分析: WPA配置

然后在Graph Explorer里面找到Window in Focus,定位到LoginUI.exe,双击: WPR焦点窗口图 WPR焦点窗口持续时间

可以发现,LogonUI.exe消耗了263秒的时间。一个只负责登录的程序显然不应该如此耗时。下一步仔细看看LoginUI.exe都在干嘛,为什么这么慢。

WPA继续分析比较困难,因为我们无法获知LogonUI.exe的底层操作,除非再挂一个Process Monitor。但换句话说,导致启动慢的也不一定是LogonUI.exe,也许是别的进程占用了系统资源呢?我们看看LogonUI.exe获得焦点的这段时间,系统各个资源的占用率如何:

资源占用率

问题大概率是某个进程在暴力读写硬盘了。查看磁盘占用率对应区间:

磁盘占用率

绿色的曲线很引人注目。它就是svchost(1792),发送了大量磁盘IO请求。打开Process Explorer看看是哪个服务:

svchost(1792)

ProfSvc服务硬盘占用率高的问题,网上有很多反馈。SuperUser上的回答说是temp下文件太多的缘故。考虑该目录下(大多)是临时文件,删除再重启试试: 删除Temp文件后的结果 启动速度明显改善(虽然还是很慢,但总算是能忍受的程度了)。

后记

  • Windows何时会删除Temp下的东西,难道让它一直占空间?不幸的是,事实确实如此,除非手动设置。参考SuperUser上的回答
  • ProfSvc究竟是干什么的,它为何扫描temp目录?网上似乎也太没有明确的说法,只知道它确实与Windows的用户配置、地址服务等有关系……
  • 为何体感WinLogon转圈转了10分钟,实际抓包只有4分半?可能是因为长期不重启之后,再重启时要更新的数据太多吧。