转载

QQ浏览器性能提升之路——windows性能分析工具篇

QQ浏览器性能提升之路——windows性能分析工具篇

对普通用户而言,评判一款浏览器是否优秀,最直观的体验就是速度,但随着新功能的迭代,不断的开始有用户反馈浏览器开始变慢,这时候就需要进行性能优化了。而在Windows上面做性能相关的工作,WPT是个必备的神器。WPT的全名是Windows Performance Toolkit,是Windows下用来进行性能分析的一套工具,它的功能非常强大,你可以使用它来监控CPU,内存,磁盘和网络等等的活动,从而来确定当前系统的性能瓶颈。

WPT 由两个独立的工具组成:  Windows Performance Recorder (WPR) and Windows Performance Analyzer (WPA) 。顾名思义, WPR 记录 Windows ETW 产生的性能数据从而生成 ETL 文件, WPA 则负责分析 ETL 文件。

安装和说明

你可以通过下载安装 Windows ADK 得到  Windows  性能工具包  (WPT)  。 https://www.microsoft.com/zh-CN/download/details.aspx?id=39982

安装后几个比较重要的文件,默认路径在: C:/Program Files (x86)/Windows Kits/10/Windows Performance Toolkit

QQ浏览器性能提升之路——windows性能分析工具篇

  • wpa.exe —  解析 ETL 文件,并图形化、表格化展示。
  • wpaexporter.exe —  导出 ETL 文件的解析结果成文本格式。
  • wpr.exe —  记录 ETW 产生的数据,命令行模式。
  • WPRUI.exe —  记录 ETW 产生的数据,图形化界面,更友好。
  • xperf.exe —  早期版本 WPT 的核心组件 Xperf ,所以现在也习惯将 WPT 称为 XPerf 。 Xperf 的功能类似于现在的 wpr+wpaexporter ,可以记录 ETW 产生的数据,也可以导出结果到文本。
  • xperfview —  早期版本 WPT 中的分析工具,功能和现在的 wpa 一样, WPT 从版本 8 以后已经没有这个 exe 了。在 WinXP 上只能使用旧版的 Xperf ,而且建议用对应的 xperfview 打开分析。
工作原理

和其他的性能分析工具不同, WPT 是由 Windows 本身的事件机制来提供支持的 ——Event Tracing for Windows (ETW) 。

ETW 是从 Windows 2000 开始就引入的一种高速的事件记录机制,自那时以后,各种 Windows 操作系统核心和服务组件都通过 ETW 记录其活动,它现在是 Windows 平台上的关键系统仪表技术之一。在 Windows 7 中, ETW 得到了进一步的增强。   正是基于 ETW 的优秀性能和强大功能,越来越多的第三方应用程序开始放弃自己的日志系统,逐渐开始使用 ETW 来追踪和记录其状态和活动,从而进行性能调优或是进行应用程序的日常维护。

下图来自 MSDN , ETW 的主要基本架构分成 4 个部分: Provider , Controller , Consumer 和 Session 。

QQ浏览器性能提升之路——windows性能分析工具篇

  • Provider :所谓的 Provider ,就是事件的提供者,它可以是系统组件,驱动程序或者是我们开发的应用程序 ,  我们在最后的记录文件中看到的事件就是来自于他们。首先,它需要向系统进行注册一个 Event Trace ,然后当这个 Provider 被 Controller 启动 (Enable) 后,它就可以开始向相应的 Event Trace Session 发送事件了。
  • Controller : Controller 就是一个控制器。它的主要任务有两个:一是 Event Trace Session 的控制管理。它利用 StartTracefunction 在内存中创建一个 Event Trace session ,这样 Provider 就知道该往哪里发生事件。而 Controller 也会负责将 Session 里记录的事件送到 Consumer 。 Controller 的第二个任务就是对 Provider 进行管理,启动或是停止 Provider 。
  • Consumer : Consumer 实时地从 Event Trace Session 或者是日志文件中订阅事件。
  • Session :它存在于内核中,用于表示一个 ETW 事件记录会话。系统中可以存在多个 Session ,每个 Session 都可以接收来自于多个 Provider 的事件,最后我们可以将多个 Session 中的事件写入一个日志文件中,这个日志文件就叫做 Trace 。

通过 ETW ,我们可以将系统所有关键的地方都加入事件,记录其行为和堆栈,比如 CPU 执行,线程切换和读写磁盘,这样我们就可以利用这些信息来进行分析了。

更多的工作原理大家可以自行参考官方介绍。

http://msdn.microsoft.com/en-us/library/windows/desktop/aa363668(v=vs.85).aspx

如何开始

说这么多,究竟如何才能定位性能问题呢?

把大象放进冰箱需要三步:第一步,把冰箱门打开;第二步,把大象放进去;第三步把冰箱门带上。我们只需要两步:

1)   生成 ETL 文件 先启动 Xperf ,这里只列了几个常用的参数。 xperf  – start  SessionName  – on  Flags|Groups  -f   filename  – maxfile  Size  – filemode  Mode  -stackwalk  flags|@file

  • -start [SessionName] :需要启动的 Session Name ,只记录 kernel logging 的话 Name 可以为空。
  • -on Flags|Groups :指定需要开启的 provider flags or groups ,通过加号(+)分隔。
  • -f filename :指定写入的文件名字, Kernel trace 默认是 Kernel.etl, user trace 默认是 User.etl 。
  • -maxfile Size :限定日志文件的大小,单位 MB 。
  • -filemode Mode :指定文件写入模式,默认是 “Sequential” ,还有 “Circular”, “Append”, “NewFile”.
  • -stackwalk flags|@file :开启 call stack 的记录。

然后停止 Xperf 并生成 ETL 文件。 xperf -stop -stop  Usersesssion  -d  filename 第一个 stop 停止 kernel logging 的记录,第二个 stop 停止名为 Usersesssion 的 session ,如果没有 user session 直接 xperf -stop -d filename 即可。

2)   分析 ETL 文件 使用 wpa 打开 ETL 文件,或者通过 Xperf 、 wpaexporter 导成文本格式分析。

踩过的坑

Xperf 的启动、配置、解析有很多参数,不是很容易上手,这里说下几个踩过的坑。

1)  版本问题:目前 Xperf 能下载到的版本有 4.8 / 6.3 / 10.0 ,这几个版本的兼容性并不是很好,生成 ETL 文件后,一定注意要用同版本的 Xperf 、 WPA 或是 XperfView 去分析,用不同版本的话会有一些奇怪的问题,例如打开报错、看不到关键数据、闪退等等。

2)  如果你正在使用 Process Monitor 或 Process Explorer ,需要先关闭它们再启动 Xperf ,否则会报错,因为这两个工具也会通过 ETW 收集信息。 QQ浏览器性能提升之路——windows性能分析工具篇

3) Win XP 只支持老版本的 WPT ,也就是用 WPT 版本 6 ( XPerf Version 4.8 )捕获 Trace 。

4) Xperf 的启动参数很多,开的越多带来的额外系统开销也会越多, ETL 文件也会越大。所以一定要按需配置,有针对性的开启需要的 providers 。 QQ浏览器性能提升之路——windows性能分析工具篇

5)  虽然我习惯了 Xperf ,但还是推荐大家优先尝试新版本里面的 WPRUI ,在易用性方面已经改善了很多。关于各个 Scenario 的含义,可以参考微软的官方文档。(当然他们写的很简略 …… )

https://msdn.microsoft.com/zh-CN/library/windows/hardware/dn927307.aspx

QQ浏览器性能提升之路——windows性能分析工具篇

6) 针对Xperf配置麻烦的问题我也封装了一个脚本,启动参数包含一些经常用到的providers,循环文件写入模式,支持Win7 / Win10 / XP。碰到可以复现的性能问题时,双击对应的bat脚本即可。也推荐同学们尝试,可以在附件里面下载。 QQ浏览器性能提升之路——windows性能分析工具篇

7)  如果开启调用堆栈( call stacks )记录功能,得先有对应的 providers flag ,然后通过 -stackwalk 开启堆栈调用记录。下面这个例子记录 sampling profiler call stacks 。 xperf -on PROC_THREAD+LOADER+PROFILE -stackwalk Profile 在 64 位的 Windows 开启 stackwalk 的功能需要设置注册表 DisablePagingExecutive 。 REG ADD “HKLM/System/CurrentControlSet/Control/Session Manager/Memory Management” -v DisablePagingExecutive -d 0x1 -t REG_DWORD -f 设置完成后需要重启操作系统才能记录调用堆栈。

高CPU占用实战

持续的高 CPU 占用是很常见的性能问题,为了方便重现,我们先借助小工具 CPUSTRES.EXE 模拟 High CPU usage 。软件打开后 active 所有的 thread ,并设置下 activity 为 Max 即可。

QQ浏览器性能提升之路——windows性能分析工具篇

通过 Process Explorer 可以看到系统的 CPU 占用已经达到 50% 左右,大部分都是 CPUSTRES 造成的。

QQ浏览器性能提升之路——windows性能分析工具篇

1、生成ETL文件

现在我们先通过上文中提到的脚本捕获一个有效的ETL文件。

  • 双击“Win7_开始监控.bat”,出现提示字样开始等待,因为这是CPU持续占用问题,特征很明显,等待几秒钟后Xperf就应该收集到了足够多的信息。

    QQ浏览器性能提升之路——windows性能分析工具篇

    在命令行窗口回车,脚本会自动生成ETL文件并压缩。

    QQ浏览器性能提升之路——windows性能分析工具篇

  • 如果你想手动启停Xperf的话,可以在命令行输入:

    xperf.exe -start -on Base -stackwalk Profile

    已知是CPU占用问题,不要开启其他providers,其中Base provider本身是一个kernel group,包含:PROC_THREAD+LOADER+DISK_IO+HARD_FAULTS+PROFILE+MEMINFO+MEMINFO_WS

    片刻后命令行停止即可:perf -stop –d test.etl

    QQ浏览器性能提升之路——windows性能分析工具篇

  • 你也可以通过WPR或是WPRUI来捕获这个ETL文件。(自己动手试试吧……)

2、分析这个ETL文件

打开之后我们会发现WPA的左侧有很多的图,并且他们被分为几类:

QQ浏览器性能提升之路——windows性能分析工具篇

  • System Activity:系统活动,里面主要是进程线程的生命周期,原始事件等等内容。
  • Computation:记录了CPU的各项活动。
  • Storage:记录了磁盘的活动和文件的操作。
  • Memory:记录了系统内存的变化。
  • Power:记录了电源相关的各种信息。

展开Computation视图后,可以看到CPUSTRES.EXE的CPU Weight百分比和Process Explorer看到的一致,50%左右。

QQ浏览器性能提升之路——windows性能分析工具篇

Symbols

没有符号文件的话,分析 Xperf trace 基本是找不到太多有用的信息的。

  1. 打开 WPA 的 Configure Symbol Paths 窗口 QQ浏览器性能提升之路——windows性能分析工具篇 QQ浏览器性能提升之路——windows性能分析工具篇
  2. Symbol Path:

    srv*C:/Symols*http://msdl.microsoft.com/download/symbols;Y:/;

    http://msdl.microsoft.com/download/symbols

    是微软官方的 symbol server ,在 load symbols 后, WPA 会把用到过的 symbols 文件下载到 C:/Symbols ,这样用到过的 symbols 文件只会下载一次。 Path 通过分号 (;) 隔开,对于用户自己的应用程序,需要在 path 里面加上对应版本的符号文件路径。
  3. SymCache Path

    WPA

    用 SymCache 文件来缓存 PDB 的符号信息,一旦 ETL 文件相关的 PDB 文件被缓存过,对这个文件重新加载符号文件会快很多。

Loading Symbols 之后,可以看到微软自己的 function stack 都解析出来了,因为没有 CPUSTRES.EXE 的符号文件,我们看不到具体的调用栈,以及是哪个函数造成的如此高的 CPU 占用。 QQ浏览器性能提升之路——windows性能分析工具篇 如果这是你自己的应用程序,通过加载符号文件后相信能够很容易从代码级别定位到问题所在。 当然 Xperf 的 trace 并不是万能的,要想快速从众多的图表中找到关键信息,首先你得对要分析的性能问题有个基本的判断,是 CPU 问题、内存问题、启动时间过长还是启动失败等等。 有了发力的点才能从ETL文件中定位出有效的信息,我们也可以结合Xperf或wpaexporter导出的文本数据做更多自动化方面的事情。

原文  http://tmq.qq.com/2016/07/easy-start-windows-performance-analysis/
正文到此结束
Loading...