性能分析工具的原理探究

Viewed 22

概述

简述常用的性能分析方案、工具及其实现原理,以便更好地理解和优化性能。

数据收集技术

硬件中断 hardware interrupts

中断

中断是处理器对需要软件注意的事件的响应。中断条件向处理器发出警报,并作为请求处理器在允许时中断当前正在执行的代码,以便及时处理事件。
如果请求被接受,处理器通过挂起其当前活动、保存其状态并执行称为中断处理程序的函数来响应(或中断服务程序,ISR)来处理事件。此中断是暂时的,除非中断指示致命错误,否则处理器会在中断处理程序完成后恢复正常活动。

硬件中断

例如,按下键盘键或移动插入PS/2的鼠标 端口触发硬件中断,导致处理器读取击键或鼠标位置。

软件中断

软件中断可能是由于执行特殊指令而有意引起的,该指令设计为在执行时调用中断。此类指令的功能类似于子程序调用,并用于多种目的,例如请求操作系统服务和与设备驱动程序交互(例如,读取或写入存储介质)。
程序执行错误也可能意外触发软件中断。这些中断通常称为陷阱或异常。例如,如果处理器执行除数为零的除法指令,则会“抛出”除以零异常(请求软件中断)。通常,操作系统会捕获并处理此异常。

代码注入 code instrumentation

注入代码来检测相关代码段的性能开销

指令集模拟 instruction set simulation

指令集模拟器 (ISS) 是一种模拟模型,通常用高级编程语言编码,它通过“读取”指令和维护代表处理器寄存器的内部变量来模拟大型机或微处理器的行为。

操作系统钩子 operating system hooks

在计算机编程中,钩子一词涵盖了一系列技术,用于通过拦截在软件组件之间传递的函数调用或消息或事件来改变或增强操作系统、应用程序或其他软件组件的行为。处理此类被拦截的函数调用、事件或消息的代码称为hook。

性能计数器 performance counters

在计算机中,硬件性能计数器( HPC ) [1]或硬件计数器是一组内置于现代微处理器中的专用寄存器,用于存储计算机系统内与硬件相关的活动的计数。高级用户通常依靠这些计数器进行低级性能分析或调整。

分析器的输出

观察到的事件的统计摘要(概况)

摘要配置文件信息通常会根据事件发生的源代码语句进行注释显示,因此测量数据的大小与程序的代码大小成线性关系。
源码跟事件、开销的对应表

记录的事件流(跟踪)

对于顺序程序,摘要概况通常就足够了,但并行程序中的性能问题(等待消息或同步问题)通常取决于事件的时间关系,因此需要完整跟踪以了解正在发生的事情。(完整)跟踪的大小与程序的指令路径长度成线性关系,因此有些不切实际。因此,跟踪可以在程序中的一个点启动并在另一点终止以限制输出。
Profiler 文件?

与管理程序的持续交互(例如,通过屏幕显示进行持续或定期监控)

与管理程序的持续交互(例如,通过屏幕显示进行持续或定期监控)
除了查看有关(仍在执行)程序的持续指标之外,这还提供了在执行期间的任何所需点打开或关闭跟踪的机会。它还提供了在关键点暂停异步进程的机会,以更详细地检查与其他并行进程的交互。
Stat 或 Profiler 界面工具

发展历史

1970

IBM/360和IBM/370 计时器中断、抽样
一般是用计时器中断在固定的时间纪录程序状态字(PSW)来侦测程序运行时的“过热点”(hot spots)
这是早期使用抽样(Sampling )方式进行性能分析的示例之一。

1973

当时Unix系统有一个基础工具prof,可以列出每一个函数,也列出此函数总共花了多少时间。

1974

指令集模拟器允许完整跟踪和其他性能监控功能

1982

gprof工具可以列出完整的函数调用图。

1994

ATOM是一个平台,可以将程序配合其性能分析工具调整,在编译期间,ATOM会在要分析的程序中加入代码,而加入的代码会输出分析数据,这种修改程序,输出自身份析数据的技术,称为逻辑注入。

分类

按分析方式分类

统计(采样)式分析器(Statistical(Sampling) profilers)

原理

采样分析器使用操作系统中断(operating system interrupts)定期探测(probes)目标程序的调用堆栈(call stack)。

优势

  • 不会侵入,对目标程序影响小,允许其以接近全速运作
  • 在实践中,采样分析器通常可以提供比其他方法更准确的目标程序执行情况,因为它们不会侵入目标程序,因此没有那么多副作用(例如对内存缓存或指令解码管道)。
  • 他们也相对不会过度评估小的、经常被称为例行程序或“紧密(tight)”循环的成本
  • 由于它们不会对执行速度产生太大影响,因此它们可以检测到否则会被隐藏的问题。他们也相对不会过度评估小的、经常被称为例行程序或“紧密(tight)”循环的成本。它们可以显示在用户模式与可中断内核模式(例如系统调用处理)中花费的相对时间量。

弊端

  • 理论上其结果数据并不准确,是个统计出来的近似值
  • 实际的误差量通常不止一个采样周期。实际上,如果一个值是采样周期的 n 倍,那么它的预期误差就是 n 个采样周期的平方根。
  • 处理中断的内核代码会导致 CPU 周期的轻微损失、转移缓存使用,并且无法区分不间断内核代码中发生的各种任务(微秒范围的活动)。

例子

  • Apple Inc.'s Shark (OSX)
  • OProfile(Linux)
  • Intel VTune
  • Intel Parallel Studio 的 Parallel Amplifier
  • Oracle Performance Analyzer
  • SmartBear Software's AQtime
  • Microsoft's CLR Profiler

插桩型分析器(Instrumentation)

原理

该技术有效地对向目标程序添加指令以收集所需信息。

优势

数据准确

弊端

插装程序会导致性能的变化
在某些情况下导致结果不准确或heisenbugs

插桩方式

  • 手动
  • 是由程序设计者加入指令,在运行时计算相关信息,例如计算事件或是调用像是应用程序响应测试(ARM)标准的API。
  • 源代码层级自动处理
  • 依照插桩政策,利用自动化工具自动在源代码中加入instrumentation,像Parasoft公司的Insure++。
  • 中间语言
  • 在汇编语言或是bytecode中加入针对多种高级语言的instrumentation,,例如OpenPATOpenPAT。
  • 编译器协助
  • 像gprof和Quantify都是这类的例子,像用gcc -pg ...可以使用gprof,用quantify g++ ...可以使用Quantify。
  • 二进制翻译
  • 此工具在编译好的可执行档中加入instrumentation,例如ATOM。
  • 运行时插桩
  • 代码直接在运行前修改,工具可以完成的监控及控制程序的运行,例如用Pin、Valgrind、DynamoRIO。
  • 运行时注入
  • 修改程度比运行时插桩要小,代码在运行时修改,令加入跳跃到协助用函数的指令,例如和DynInst。

基于事件的分析器(Event-based profilers)

原理

通过事件或回调函数来监听关键调用

例子

  • Java
  • JVMTI
  • 提供给性能分析器的hook,可以抓到像函数调用、类别加载、卸载、线程的进入及离开等事件
  • .NET
  • profiling agent
  • 在运行会提供许多回调函数给代理器,可以捕捉到像是方法JIT/进入/离开,对象创建及其他
  • 性能分析代理器可以用任意方式改写目的应用程序的字节码
  • Python
  • profile
  • 以调用函数图为基础的hotshot,以及用'sys.setprofile'函数来捕捉像c_{call,return,exception}及python_{call,return,exception}的事件
  • Ruby
  • 类似Python的性能分析界面。目前有在profile.rb中的一般性能分析器及相关模块

解释器式的插桩(Interpreter instrumentation)

原理

解释器调试选项可以在解释器遇到每个目标语句时启用性能指标的收集。比如字节码、控制表或 JIT 解释器,它们通常可以完全控制目标代码的执行,从而提供极其全面的数据收集机会。

虚拟机监控器或仿真器(Hypervisor/Simulator)

原理

在 虚拟机监控器 和 指令集模拟器 下运行无修改的程序时可收集信息。
参见:指令集模拟 instruction set simulation

解释

  • Hypervisor
  • 虚拟机监控器、virtual machine monitor,缩写为 VMM ,在hypervisor下运行(一般而言)没有修改的程序,可以收集相关信息,例如SIMMON工具。
  • 仿真器及hypervisor
  • 在指令集模拟器运行(一般而言)没有修改的程序,可以交互式及选择性的收集相关信息,例如SIMON及OLIVER工具。

按输出方式分类

调用图分析器 Call-graph profiler

显示了函数的调用时间和频率,以及基于被调用者的调用链
在某些工具中,不会保留完整的上下文

平面探查器 Flat profiler

根据调用计算平均调用时间
不会根据被调用方或上下文分解调用时间

输入敏感分析器 Input-sensitive profiler

通过将性能度量与输入工作负载的特征(例如输入大小或输入值)相关联,为平面或调用图分析器增加了一个维度
生成的图表描述了应用程序的性能如何随输入的变化而变化

实例

UE4

相关工具

Session Frontend
Stat

工具截图

image.png

所用方案

Instrumentation

如何扩展

扩展步骤

  1. 定义

  2. DECLARE_STATS_GROUP(TEXT("MarsTest"), STATGROUP_MarsTest, STATCAT_Advanced)

  3. DECLARE_CYCLE_STAT(TEXT("MarsTest_Character_Tick"), STAT_MarsTest_Character_Tick, STATGROUP_MarsTest)

  4. 使用

  5. SCOPE_CYCLE_COUNTER(STAT_MarsTest_Character_Tick)

效果图

Stat MarsTest

Frontend - Profiler

核心原理

UE4 的 Profiler 基于 Instrumentation ,通过 STAT 相关 Macro 来埋点插桩、通过调用各平台的高分辨率时间戳来测量时间间隔等。
详见:UE4 Profiler 性能分析工具原理和实现机制

Unity

相关工具

Profiler

工具截图

所用方案

Instrumentation

如何扩展

  • Profiler
  • Profiler.BeginSample("MyPieceOfCode");
  • Profiler.EndSample();
  • ProfilerMarker
  • s_PreparePerfMarker.Begin();
  • s_PreparePerfMarker.End();
  • CustomSampler
  • sampler.Begin();
  • sampler.End();
  • Recorder
  • 同 CustomSampler
  • 方案优劣
  • 当 Profiler 收集检测数据时,ProfilerMarker 有助于减少开销和传输的数据量。Profiler.BeginSample 将完整字符串传输到数据流,而 ProfilerMarker.Begin 和 CustomSampler.Begin 仅传输标记的整数标识符。
  • 另外 ProfilerMarker.End 向 Recorder 提供上下文信息,因此可以在播放器中跟踪标记代码的时序。

核心原理

Unity 的 Profiler 基于 Instrumentation ,通过 ProfilerMarker 等相关 API 来埋点打桩并获取和计算相关代码段的开销等。

PlayStation

相关工具

Razor CPU
Razor CPU Live

工具截图

所用方案

Sampling

VisualStudio

相关工具

CPU Usage

工具截图

所用方案

Instrumentation

MagicSniffer

相关工具

CPU

工具截图

所用方案

Sampling

基于 Event Tracing for Windows 的 Sampling,源码和原理参见 optick 的实现方案。

iOS

相关工具

Instruments
Shark

工具截图

所用方案

Shark
Sampling
Instruments
基于 DTrace 的 Instrumentation ?

Android

相关工具

Snapdragon

工具截图

所用方案

Sampling ?

Xbox

相关工具

Pix

工具截图

所用方案

Sampling ?

Intel VTune

相关工具

VTune

工具截图

所用方案

Event-based Sampling

参考

Profiling_(computer_programming)
Profiling and Performance measurement in Game Development
Intro to Profiling | Game Engine series
CPU性能分析工具原理
Profilers是如何工作的(性能分析器原理)
了解性能分析器及其数据
Understanding How General Exploration Works in Intel® VTune™ Amplifier
Hardware Event-based Sampling Collection
User-Mode Sampling and Tracing Collection
PerformanceAndProfiling
UE4-程序性能优化与调试相关笔记
[UE4]Statコマンドに情報を追加しよう
StatsSystemOverview
List of performance analysis tools
ProfilerCPU
ProfilerMemory
Memory debugger
Profiling Applications Made with Unity
Profiling with Instruments
Understanding optimization in Unity - Profiling
Measure application performance by analyzing CPU usage
Understand profiler performance collection methods
DTrace
Projektspecifikation
Snapdragon Profiler
PIX on Windows

**声明:**本文来自公众号:GameDevLearning,转载请附上原文链接及本声明。

0 Answers