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

  • 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。

  • 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收集信息。

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

4) Xperf的启动参数很多,开的越多带来的额外系统开销也会越多,ETL文件也会越大。所以一定要按需配置,有针对性的开启需要的providers。

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

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

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即可。

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

1、生成ETL文件

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

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

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

  • 如果你想手动启停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
  • 你也可以通过WPR或是WPRUI来捕获这个ETL文件。(自己动手试试吧…...)

2、分析这个ETL文件

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

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

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

Symbols

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

  1. 打开WPA的Configure Symbol Paths窗口
  1. 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里面加上对应版本的符号文件路径。
  2. SymCache Path WPA用SymCache文件来缓存PDB的符号信息,一旦ETL文件相关的PDB文件被缓存过,对这个文件重新加载符号文件会快很多。

Loading Symbols之后,可以看到微软自己的function stack都解析出来了,因为没有CPUSTRES.EXE的符号文件,我们看不到具体的调用栈,以及是哪个函数造成的如此高的CPU占用。

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

原文发布于微信公众号 - 腾讯移动品质中心TMQ(gh_2052d3e8c27d)

原文发表时间:2016-07-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏运维一切

mfs挂载失去连接问题 原

我在系统上部署了一个web应用,这个应用使用了mfs挂载使用静态资源,但是每次就突然进程没了,挂载点重新挂载又可以了。经查发现居然是因为我分派的内存太小,fpm...

8720
来自专栏FreeBuf

打开文件夹就运行?COM劫持利用新姿势

*本文原创作者:菠菜,本文属FreeBuf原创奖励计划,未经许可禁止转载 打开文件夹就能运行指定的程序?这不是天方夜谭,而是在现实世界中确实存在的。利用本文探讨...

26480
来自专栏黑白安全

iOS安全基础之钥匙串与哈希

本文最初是由Chris Lowe编写的,后来经过Ryan Ackermann(ios系统开发者)的修改,已经可以针对最新的Xcode 9.2,Swift 4,i...

11720
来自专栏张善友的专栏

性能分析工具-PerfView

Roslyn的PM(程序经理) Bill Chiles,Roslyn使用纯托管代码开发,但性能超过之前使用C++编写的原生实现,这有什么秘诀呢?他最近写了一篇文...

30870
来自专栏西枫里博客

关机后远程唤醒的配置,简单实现广域网远程开机和连接

出门在外经常需要家里或者办公室电脑里面的资料。通常通过远程桌面等控制类软件连接。当家里没人,没人开电脑就麻烦了,如果让家里电脑始终开着浪费能源,所以远程桌面...

45220
来自专栏编程坑太多

『中级篇』镜像的发布(18)

####具体的dockerhub如何注册,我就不解释了。今天的任务就是把自己的image push到自己的docker push里面,请看我的表演!

19170
来自专栏竹清助手

Laravel 5 系列入门教程(一)【最适合中国人的 Laravel 教程】

2. http://www.golaravel.com/laravel/docs/5.0/

63820
来自专栏程序猿

Git面试常见问题

有次推送了Git的基本配置。 Git作为团队开发的利器,在面试的时候,被问到的概率很大。 基础部分--大家平时都用什么工具? 出了Git自带的命令行工具外,作为...

43450
来自专栏张善友的专栏

一款免费的.NET智能持续测试运行工具——Mighty-Moose

Mighty-Moose是一款面向.NET的持续构建和测试运行工具,现在它免费发放了。 那么Mightly-Moose到底是干什么的呢?当你每次在Visual ...

216100
来自专栏微信终端开发团队的专栏

Hello Bonjour!

Hello Bonjour! 一开始用Bonjour,我是拒绝的。 让我们以一个问题开头:如何能在本地网络找到自己想要的硬件设备及相应服务,并连接? 在这个以I...

278100

扫码关注云+社区

领取腾讯云代金券