使用 Intel® VTune™ Amplifier 分析 Java 和 Python 代码
在这里,我们探讨如何使用 Intel® VTune™ Amplifier 来更深入地了解应用程序的性能。
点击此处注册并下载免费的 Intel® Parallel Studio XE 30天试用版.
Java* 长久以来一直是开发者青睐的语言,并且在企业、嵌入式和物联网 (IoT) 应用中越来越受欢迎。Intel® VTune™ Amplifier 性能分析器(Intel® 软件工具套件的一部分)早已支持对 Java 和 .NET 等托管代码进行性能分析。Python* 也因其易于编程和更高效地集成系统的能力而成为一种流行的编程语言。
随着这两种不同编程语言的普及,确保应用程序能有效利用可用的 CPU 能力至关重要。为了满足这些需求,Intel VTune Amplifier 已将其性能分析能力扩展到基于 Java 和 Python 的应用程序。在这里,我们探讨如何使用 Intel VTune Amplifier 来更深入地了解应用程序的性能。
什么是 Intel VTune Amplifier?
Intel VTune Amplifier 是一款性能和功耗分析器,可以帮助您发现占用 CPU 时间最多的特定模块/进程(热点)。它还可以通过采样技术,以极低的开销捕获微架构层面的问题(例如,缓存未命中、页错误、TLB 问题等)。
为什么需要应用程序性能分析?
应用程序性能分析对于找出消耗最多 CPU 时钟周期的各种代码块是必需的。这类信息可以通过手动插入定时 API 来获取。但是,当您的项目有很多模块时,手动检查和发现导致问题的模块会花费更多时间。Intel VTune Amplifier 提供了许多分析器,可以帮助深入查找问题。
Intel VTune Amplifier 功能
Intel VTune Amplifier 具有各种直观易用的功能。它
- 使用采样技术,与用于性能分析的插桩技术相比,开销极小。
- 是一款易于使用的性能分析器,具有各种分组/过滤/调用者-被调用者选项,有助于聚焦有问题的代码。
- 可以在源代码级别和汇编级别提供信息。
- 可以提供关于应用程序的各种微架构信息。
性能分析 Java 应用程序
性能分析 Java 应用程序有四个步骤:
- 创建 Intel VTune Amplifier 项目。
- 选择要性能分析的应用程序/进程。
- 选择分析类型。
- 收集结果并进行解释。
在 Windows* 系统上创建 Intel VTune Amplifier 项目
首先,使用 amplxe-vars 批处理文件设置环境变量。例如,如果您使用默认目录安装了 Intel VTune Amplifier,请键入
C:\[Program Files]\IntelSWTools\VTune Amplifier XE\amplxe-vars.bat
该批处理文件将显示产品名称和构建号。
接下来,启动 Intel VTune Amplifier。对于独立的 GUI 界面,运行 amplxe-gui
命令。或者,对于命令行界面,运行 amplxe-cl
命令。
创建 Intel VTune Amplifier 项目(仅限独立版本)
- 单击右上角的菜单按钮,然后转到 New > Project。
- 在“Create Project”对话框中指定项目名称和位置。
注意:如果您正在使用 Linux* 平台,请参阅 《Linux* OS 版 Intel® VTune™ Amplifier XE 2016 入门指南》,了解如何创建新项目。
选择要性能分析的应用程序/进程
在“Analysis Target”选项卡中,从左侧窗格选择目标系统,并从右侧窗格选择分析目标类型。您可以
- 使用“Launch Application”启动要性能分析的应用程序。
- 使用“Attach to Process”将性能分析器附加到正在运行的应用程序。
- 通过选择“Profile System”观察应用程序与系统调用的交互。
如果您选择“Launch Application”,请在“Application”字段中提供 java.exe 文件的路径,并在“Application parameters”(图 1)中提供一组参数,如“Java options”或“prop files”。此外,您可以在“User-Defined Environment variables”字段中提供应用程序运行可能需要的环境变量集。或者,定义一个包含各种环境变量、java.exe 二进制文件和参数的 *.bat 文件,并在“Application”字段中提供此 *.bat 文件,而不是 java.exe 文件。
选择分析类型
切换到“Analysis Type”选项卡,选择“Basic Hotspots”分析类型,然后单击“Start”。
收集结果并进行解释
在本示例中,我们使用了 SPECjbb2000 基准测试。
数据收集和最终化完成后,将打开“Summary”选项卡,显示各种指标。让我们在此处解释一些指标:
- 在“Summary Tab”的第一部分(图 2),我们看到应用程序的“Elapsed Time”(应用程序从开始到停止的挂钟时间)、“CPU Time”(应用程序积极利用 CPU 的时间)、“Total Thread Count”(应用程序中部署的线程数)。图 2 - 运行时间
- “Summary tab”的第二部分(图 3)显示“Top Hotspots”,即占用 CPU 时间最多的函数。在我们的示例中,我们有前五个热点,第一个热点占用了 13.165 秒。但是,我们可以看到在“Module”列下既有 [Dynamic code] 也有 [Compiled Java code],它们是 Java 方法,无法归类到任何原生二进制模块。所有 Java 用户方法都归类到 [Compiled Java code] 模块。此外,JVM 可能会为其内部使用生成一些方法,并将其报告给 Java 分析器。这些方法归类到 [Dynamic code] 模块。
“Summary tab”的第三部分(图 4)包括“CPU Usage Histogram”,它可视化了运行应用程序的逻辑核心数量。颜色编码表示 Intel VTune Amplifier 如何对应用程序使用的核心数量进行分类:Idle(空闲)、Poor(差)、OK(好)和 Ideal(理想)。
通过查看“Bottom-Up tab”(图 5),我们可以检索更多详细信息。在该选项卡中,我们有时间线视图,可以通过各种 分组 和 过滤 来可视化线程上的工作负载,并聚焦于特定的时间间隔。通过双击感兴趣的函数/模块,我们可以进一步深入到源代码。
为了快速开始优化代码,深入到特定的源代码位置会很有帮助。除了源代码,我们还可以看到给定源代码行对应的已生成汇编代码(图 6)。
除了通过“Basic Hotspots”分析类型了解占用最多 CPU 资源的模块外,我们还可以使用 Concurrency Analysis 类型来查找线程之间的上下文切换和转换(图 7)。黄色线条表示线程之间的转换。
使用“General Exploration”分析类型来执行 架构分析,以深入了解与缓存、TLB、页错误、伪共享等相关的各种问题。
性能分析 Python 应用程序
Python 性能分析是 Intel VTune Amplifier 2017 版本的新功能。
请参阅《Parallel Universe》杂志第 25 期中题为“使用 Intel® VTune™ Amplifier XE 加速 Python* 代码运行”的文章,了解如何开始使用 Intel VTune Amplifier 进行 Python 应用程序性能分析。该文章重点介绍了混合模式分析、解析 *.pyd 模块的符号以及为 Cython* 编译设置 编译器 和链接器标志。
混合模式分析
Python 是一种解释型语言,不使用编译器生成二进制执行代码。Cython 也是一种解释型语言(但它是 C 扩展),并且可以构建为原生代码。Intel VTune Amplifier 2017 可以完全支持报告 Python 和 Cython 代码中的热点函数。
Cython 的工作流程分两步:
- 将 *.pyx (Cython) 文件转换为 *.c 文件
- 将此 *.c 文件编译为 *.pyd 文件(相当于 Linux 上的 .so 文件)
本示例中使用的样本是一个 512*512 大小的矩阵乘法。
以下是生成 *.pyd 文件并使用 VTune Amplifier 解析符号的步骤:
- 使用允许您使用 Cython 将 *.pyx 源代码从 Python 转换为 C 的扩展以及编译器和链接器标志设置 setup.py 文件。
#setup.py from distutils.core import setup from Cython.Build import cythonize from distutils.extension import Extension from Cython.Distutils import build_ext setup( cmdclass = {'build_ext': build_ext}, ext_modules = [Extension('Matrix_mul', sources=["Matrix_mul.pyx"], extra_compile_args=['/Z7'], extra_link_args=['/DEBUG']), ], )
在上面的 setup.py 文件中,使用编译器标志
/Z7
和链接器标志/DEBUG
创建了扩展,以生成调试符号。如果希望在 Intel VTune Amplifier 中深入到源代码级别,包含这些标志非常重要。如果您正在使用 Linux 平台,请在 extra_compile_args 和 extra_link_args 中都使用 -g。 - 使用以下命令调用 Python,通过 Cython 将其转换为 C:
python setup.py build_ext
此命令将生成相应的 *.c 和 *.pyd 模块。在本例中,我们应该看到 Matrix_mul.c 和 Matrix_mul.pyd。由于我们还要求生成符号信息,所以我们也应该看到一个 *.pdb 文件。
- 创建一个导入 Matrix_mul.pyd 模块的 Python 脚本,如下所示:
#simple.py import Matrix_mul Matrix_mul.func();
- 使用 Intel VTune Amplifier 2017 中的“Basic Hotspots”分析类型,以 simple.py 作为 Python 解释器的参数来分析应用程序(图 8)。图 8 - 选择目标和分析类型
- “Basic Hotspots”分析完成后,“Bottom-Up”选项卡中将显示模块/函数(图 9)。图 9 - 模块/函数
在此示例中,Matrix_mul.pyd 模块(转换后的模块)是占用大部分 CPU 时间的前几个热点之一。在页面底部的“Filter”部分,我们选择了“Only user functions”(仅用户函数),因为我们有兴趣单独分析/分析用户代码。要查看用户和系统级别的函数及其交互,请选择“User/system functions”(用户/系统函数)。我们可以进一步深入到这些源文件中的每一个,以找出这些模块在特定源代码行处的问题。我们还可以看到为 C 代码生成的相应汇编代码。通过双击上面的第一个用户函数热点,我们可以看到相应的源文件,如图 10 所示。
使用“Source View”,我们可以将生成的 C 代码与相应的 Python 代码(第 1052-1058 行,对应 Python 代码)关联起来。利用这些数据,用户可以聚焦于 Intel VTune Amplifier 识别出的有问题的 Python 代码片段/模块,并开始进行优化。
使用“Caller/Callee”选项卡查看所选函数/模块的调用者-被调用者关系(图 11)。
摘要
Intel VTune Amplifier 可用于将性能分析缩小到 Java 或 Python 应用程序中占用更多 CPU 时间(热点)的特定代码。这对于纯 Python 应用程序以及混合 Python/Cython 代码都可行。