我的计算机需要很长时间才能关机。
我如何才能找出罪魁祸首?我不想等几分钟才让电脑关机……
是否有一个程序可以用来跟踪关机需要多长时间?
答案1
Windows 提供性能计数器也事件追踪它允许应用程序进行性能分析,以便可以查明性能问题的原因,其中有一个出色的工具包:Windows 性能工具包可在Windows SDK。
在此工具包中,您将找到xbootmgr.exe
适用于Windows 开/关转换性能分析。
尽管上面链接的文档详细介绍了每次开/关转换,但这里是使用xbootmgr
xperf GUI 跟踪和分析关机转换的一般思路:
下载 Windows SDK,然后使用它安装 Windows 性能工具包。
以管理员身份打开命令提示符,然后运行:
cd %ProgramFiles%\Microsoft Windows Performance Toolkit
如果您以后需要帮助,您可以
xbootmgr -help
输入xperf /?
。像这样进行重启跟踪:
xbootmgr -trace shutdown -traceFlags BASE+DIAG+LATENCY -noPrepReboot
启动后,两分钟内就会产生痕迹。
该跟踪已保存在 中
%ProgramFiles%\Microsoft Windows Performance Toolkit
,您可以将其拖到 上xperf.exe
,它将在 GUI 中打开。您将看到一个带有不同图表的 GUI,左侧的箭头允许您添加/删除图表。
查看图表,看看是否能发现任何异常,您可以选择一个间隔并放大它(如果您愿意)。如果想查看整体,请右键单击并缩小。
对于每个图表,您可以右键单击以获取汇总表当前选定的间隔。
在这些表中,按权重或时间排序,找出花费最多的是哪个。请注意,您可以拖动列,例如,I/O 表允许您查看使用率最高的流程以及使用率最高的路径。
分隔线(黄色标题列)使得其右侧的列显示其左侧列的总数。因此,如果您先有路径,然后有进程,那么您可以打开某个文件的树以查看哪些进程访问了该文件,然后获得该进程/文件组合的总数。
您可以找到有关图表和表格如何运作的更多信息这里。
如果你需要深入查看堆栈跟踪,请执行另一个启动跟踪并附加参数
-stackWalk profile
,设置 _NT_SYMBOL_PATH然后右键单击任何图表并启用“加载符号”。这将允许您检查它实际调用的函数,一般来说,您在关机时不需要这个;但它可以允许诸如发现防火墙正在干扰您作为程序员的调试器之类的事情。非常漂亮...
祝你好运,希望你能找到罪魁祸首。如果不能,就留下线索,我们会帮你看看……
答案2
我的关机需要很长时间才能完成。以下是我的示例汤姆的回答。
第一个图表显示了问题,磁盘 I/O:
我的关机花了一分多钟,而且都是硬盘 I/O。
下一个图表磁盘利用率显示驱动器的使用率已接近 100%:
最终图表显示进程的磁盘利用率:
经过筛选我意识到这一切都是由以下原因造成的WinInit.exe
:
右键单击任意硬盘图表并选择汇总表,我可以获得哪些文件被哪些进程访问的详细信息:
我关机时花了 56.4 秒将WinInit
6.7GB 写入C:\hiberfil.sys
。
但问题是为什么Windows 是否正在写入我的休眠文件关闭?
然后我想起我打开了一个选项来清除它页面文件关机时:
- 开始 -> 运行 -> SecPol.msc
- 安全设置、本地策略、安全选项
- 关机:清除虚拟内存页面文件
所以我禁用了该选项,然后xbootmgr
再次运行。现在我的关机时间为 22 秒:
现在关机9s
的22s
时间都花在System
写入某个unknown
文件上了。这可能值得进一步调查。
但是现在我已经解决了一分半钟的关机问题。
我进一步解决了 22s 关机缓慢的问题。从 t=12s
到 t=21s
显示 100%磁盘利用率,但为零磁盘 I/O. 真是令人困惑。
直到一次关机时,我听到了熟悉的硬盘旋转的声音。由于 Windows 试图访问已进入睡眠状态的磁盘,因此关机暂停了 9 秒。九秒后,硬盘响应,片刻之后,机器关闭。
讽刺的是,Windows 唤醒磁盘是为了告诉它该进入睡眠状态了。
这将使我的实际关机时间为 13.5 秒。这可能值得进一步研究。但目前我已经解决了 22 秒关机的问题。