转载

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 称为 XPerfXperf 的功能类似于现在的 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 来追踪和记录其状态和活动,从而进行性能调优或是进行应用程序的日常维护。

下图来自 MSDNETW 的主要基本架构分成 4 个部分: ProviderControllerConsumerSession

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

  • Provider :所谓的 Provider ,就是事件的提供者,它可以是系统组件,驱动程序或者是我们开发的应用程序 我们在最后的记录文件中看到的事件就是来自于他们。首先,它需要向系统进行注册一个 Event Trace ,然后当这个 ProviderController 启动 (Enable) 后,它就可以开始向相应的 Event Trace Session 发送事件了。
  • ControllerController 就是一个控制器。它的主要任务有两个:一是 Event Trace Session 的控制管理。它利用 StartTracefunction 在内存中创建一个 Event Trace session ,这样 Provider 就知道该往哪里发生事件。而 Controller 也会负责将 Session 里记录的事件送到 ConsumerController 的第二个任务就是对 Provider 进行管理,启动或是停止 Provider
  • ConsumerConsumer 实时地从 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 停止名为 Usersesssionsession ,如果没有 user session 直接 xperf -stop -d filename 即可。

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

踩过的坑

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

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

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

3) Win XP 只支持老版本的 WPT ,也就是用 WPT 版本 6XPerf 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 ,并设置下 activityMax 即可。

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. 打开 WPAConfigure 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性能分析工具篇 如果这是你自己的应用程序,通过加载符号文件后相信能够很容易从代码级别定位到问题所在。 当然 Xperftrace 并不是万能的,要想快速从众多的图表中找到关键信息,首先你得对要分析的性能问题有个基本的判断,是 CPU 问题、内存问题、启动时间过长还是启动失败等等。 有了发力的点才能从ETL文件中定位出有效的信息,我们也可以结合Xperf或wpaexporter导出的文本数据做更多自动化方面的事情。

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