你的应用程序的核心目标是为最终用户提供卓越的服务体验。
这要求你的应用必须具备快速响应、操作便捷、高度可靠等诸多理想特性。
然而,要持续维护软件以保持其顶级性能并非易事。
当代码开始调用不必要的函数、出现逻辑错误、捕捉异常并陷入多余的循环时,效率问题就会浮现。 你的应用程序可能会因此变得迟缓、无响应或运行不稳定。
如果这些问题得不到解决,应用程序的整体性能将不可避免地受到影响。
最终,你的客户可能会因为不良的性能和缓慢的速度而感到沮丧,甚至完全放弃使用你的应用程序。 这不仅会损害你的声誉,还会导致收入和利润的损失。 因此,对代码进行分析、审查和调试以达到最佳性能至关重要。 最快捷的方法是利用软件分析工具来监控和调试代码,从而消除与性能相关的瓶颈。
本文将深入探讨软件分析及其益处。 接下来,我将向你介绍一些优秀的分析工具,它们可以帮助你调试应用程序并优化其性能。
什么是软件分析?
软件分析是一种动态代码分析方法,它利用程序运行时收集的数据来研究程序的行为。 其目的是识别程序中需要优化的部分,以提高应用程序的速度和响应能力,并降低其内存和资源消耗。
软件分析器通常会测量函数调用的持续时间和频率,以及程序相关的内存或时间复杂度。 此外,还有一些专门的分析器,如内存分析器。
分析通常通过对程序的源代码进行插桩来实现。 分析器可以使用各种技术,例如插桩、基于事件、统计或模拟方法。
为什么软件分析如此重要?
软件分析对于确定与特定功能相关的资源使用情况和执行时间至关重要。 它有助于优化程序的速度,同时确保它尽可能地减少资源消耗。
此外,它还可以用于跟踪和优化 CPU 使用率和指令执行时间。
因此,选择正确的软件分析工具对于更快地调试与性能相关的问题至关重要,从而提高效率并提供更好的用户体验。 许多分析器还提供详细的报告、交互式图表和可视化效果,帮助你准确定位问题的根本原因,从而更轻松地解决问题。
接下来,我们将列出一些你可以尝试的最佳软件分析器,并帮助你选择最适合你的工具。
py-spy
py-spy 是一款出色的 Python 采样分析器。 它可以让你快速了解 Python 应用程序在各个环节所花费的时间。
为此,你无需修改代码或完全重启程序。 py-spy 开销较低,并使用 Rust 开发以实现更快的速度。 它不是为了在运行 Python 分析程序的同一进程中运行而构建的,这意味着 py-spy 非常安全,可用于 Python 生产代码。
该工具允许你记录性能数据、生成火焰图以创建交互式 SVG 文件。 你还可以调整采样率、用于分析的本机 C 扩展、子进程、线程 ID 等其他选项。 你可以使用 “top” 命令实时查看程序中正在执行的函数,并使用每个 Python 线程的 “dump” 命令来显示当前的调用堆栈。
它支持各种 CPython 解释器版本,例如 2.3 – 2.7 和 3.3 – 3.8。 你可以通过 PyPI 或 GitHub 安装 py-spy。
Pyroscope
开源的持续分析软件 Pyroscope 可以帮助你在几分钟内调试应用程序中的性能问题。
无论你使用 Docker、Linux,或者正在寻找 Ruby 或 Go 文档,你都可以启动服务器,然后启动代理,Pyroscope 都能满足你的需求。 即使你的目标是十秒或十个月的软件分析数据,他们定制设计的存储引擎也可以实现快速查询。
你不必担心开销或应用程序性能,因为它采用不影响性能的采样分析技术。 Pyroscope 可以有效地存储你的分析数据;因此,即使你想存储来自多个应用程序的多年分析数据,它也是经济高效的。
它适用于 macOS、Linux 和 Docker,并支持使用 Python、Go 和 Ruby 编写的程序。
Bubbleprof
Bubbleprof 是 Clinic.js 提供的一种新颖独特的分析 Node.js 软件的方法。 它利用“气泡”UI 来帮助从专家到初学者的每个人确定应用程序中花费的异步时间。
它通过观察异步操作、对其进行分组、计算延迟并映射它们来可视化 Node.js 进程的运行方式。
Bubbleprof 通过观察特定操作组中的气泡大小来确定操作时间,这些操作可以是你的代码、Node 核心或模块。 它还会合并相邻的组以减少混乱。
为了计算操作从一个组流向另一个组时的延迟,Bubbleprof 会测量连接气泡的箭头长度。 除此之外,它还在测量过程中使用不同的颜色。 同时,内部彩色线条代表异步操作类型的混合,用于表示延迟的原因。
Pyinstrument
使用 Pyinstrument 优化你的 Python 代码。
它可以显示 Python 代码运行缓慢的原因,并帮助你诊断问题,从而实现更快的性能。
要使用 Pyinstrument,你不必编写 Python 脚本;只需直接从命令行调用 Pyinstrument 即可。 你的脚本将正常运行,并且该工具会生成应用程序花费时间的彩色摘要。 它还提供 Python API,使该过程更加容易。
你还可以选择在 Flask 和 Django 中分析 Web 请求,他们为此提供了详尽的文档。 在此需要注意的是,Pyinstrument 提供的是统计分析,它每 1 毫秒记录一次调用堆栈,而不是跟踪程序执行的每个函数调用。
与跟踪分析器相比,统计分析器的开销更低。 由于它记录了整个堆栈,因此跟踪代价高昂的函数调用变得轻而易举。 此外,Pyinstrument 默认情况下隐藏库框架,以便你可以专注于影响性能的应用程序或模块。
调试性能问题变得更容易,因为 Pyinstrument 会记录使用“挂钟”时间所花费的时间。 该工具会跟踪程序读取文件、下载数据、与数据库通信等所有时间。
Xdebug
为了改进代码的性能问题并让开发体验更愉快, Xdebug 提供了广泛的分析和调试功能。
它实际上是一个 PHP 扩展,允许你查找 PHP 应用程序中的瓶颈,并使用外部可视化工具分析其性能以生成性能图。
Xdebug 创建详细的输出,显示应用程序到达错误路径的过程,包括它传递给指定函数的参数。 这有助于跟踪错误。 为了帮助开发人员清楚地理解情况,它会生成带有颜色编码的信息以及结构化的视图。
它还提供一个远程调试器,你可以使用该调试器将 Xdebug 与正在运行的代码、IDE 或浏览器连接起来,以便查看代码断点并逐行执行代码。 它提供的另一个功能是代码覆盖率,可以显示程序代码的执行程度,这也有助于你进行单元测试。
SPX
简单分析扩展 (SPX) 是为 PHP 设计的分析扩展。 它具有一些独特的特性,使其与其他分析扩展有所区别。 它是完全免费使用的,并且仅限于你的基础设施,这意味着不存在数据泄露的风险。
SPX 的简单性使其非常易于使用:你只需要设置命令行或环境变量来分析脚本即可。 或者,你也可以在网页上单击单选按钮来分析脚本。 因此,你无需手动插桩代码。
它还支持运行命令行脚本 – Ctrl-C。 此外,此过程也消除了使用命令行启动程序或专门浏览器扩展的需要。 SPX 支持大约 22 种指标,包括各种时间和内存指标、对象、正在使用的文件、I/O 等。
它可以在不离开上下文的情况下收集数据。 它的 Web UI 允许为当前使用的浏览器会话配置/启用分析,并列出所有分析脚本的详细信息和报告。 Web UI 允许你选择特定的报告以进行更深入的分析,并提供一些交互式可视化效果,例如火焰图、平面配置文件和时间线,这些可视化效果可以扩展到数百万次的函数调用。
Prefix
Prefix 是 Stackify 开发的一款易于安装且轻量级的代码分析器,深受许多开发人员的喜爱。 它可以帮助你消除应用程序性能中的瓶颈,从而优化应用程序并改善用户体验。
Prefix 卓越的跟踪和分析功能使你能够快速找到隐藏的异常、缓慢的 SQL 查询等。 它为开发人员提供了 APM(应用程序性能监控)的真正力量。 为此,Prefix 会按照编写的方式验证代码的性能,并允许你推送性能更高的代码进行测试。
这样一来,它从生产端收到的支持工单会减少,并有助于开发经理更快地实现目标。 它可以发现所有性能不佳的查询、未知瓶颈以及 ORM 生成的查询。
你还可以跟踪每个 SQL 调用参数、下载计时并查看受影响的记录。 Prefix 也让识别 N+1 模式变得更加容易。 现在你可以将那些混乱的日志整合在一起,从而轻松定位问题。
Prefix 允许你直接在查询请求中找到可疑日志的上下文,并从一个日志跳转到跟踪以方便调试。 Prefix 可以揭示性能不佳的依赖项,这对于查找隐藏的异常和处理遗留代码或框架部分非常有用。 这些依赖项可以是 Web 服务、第三方服务、缓存服务等。
Prefix 适用于 Windows 和 Mac,并支持 .Net、Ruby、Java、PHP、Python 和 Node.js。
Scalene
Scalene 是一款用于基于 Python 的程序的高精度、高性能的 GPU、CPU 和内存分析器。 与其他分析器相比,它具有许多优点,例如运行速度更快,并提供更深入的信息。
Scalene 速度非常快,它使用采样而不是插桩。 它甚至不依赖 Python 的跟踪工具。 此外,它的开销通常低于 10-20%。 该工具在行级别执行软件分析,并指出导致程序执行时间长的那些代码行。
这些细节比函数级分析的细节更有价值。 Scalene 可以区分纯粹花费在 Python 代码中的时间和花费在包括库在内的本机代码中的时间。 由于大多数 Python 程序员不会优化本机代码的性能,因此开发人员可以将精力集中在优化可实际改进的代码上。
它以红色突出显示热点,使你更容易发现 CPU 时间/内存分配,并轻松分离系统时间以查找 I/O 问题。 Scalene 可以报告 GPU 时间、分析内存使用情况并跟踪 CPU 使用情况。 Scalene 还可以识别潜在的内存泄漏、配置文件副本,并为占用超过 1% CPU 的代码行生成减少的配置文件。
VisualVM
VisualVM 是适用于 Java 的多合一故障排除工具,旨在用于生产和开发阶段。 它是一款可视化软件,集成了轻量级分析功能和命令行 JDK 工具。
VisualVM 监控在 Java 1.4+ 上运行的应用程序,并使用 JMX、jvmstat、Attach API 和 Serviceability Agent 等多种技术对其进行故障排除。 该工具非常适合质量工程师、系统管理员和最终用户的不同需求。
它自动检测远程和本地运行的基于 Java 的应用程序并列出它们。 该工具还允许你使用 JMX 连接手动定义程序。 对于每个进程,它会显示典型的运行时数据,例如 PID、传递的参数、JDK 主页、主类、JVM 标志、JVM 版本以及系统和参数属性。
VisualVM 监控应用程序中的 CPU 使用率、堆和元空间或永久代内存、运行的线程和加载的类。 它在时间线中显示所有正在运行的线程,其中包含汇总的睡眠、运行、停放、监控和等待时间。
你可以使用 VisualVM 执行插桩和采样分析器,以实现内存管理和应用程序性能。 它会显示线程转储,从而快速了解进程。 它还可以按需查看和创建 .hprof 快照,从而帮助你发现堆使用效率低下和调试内存泄漏。
此外,VisualVM 可以读取崩溃的基于 Java 的进程及其环境的基本数据。 你可以离线分析你的应用程序;它可以使用已获取的堆转储、线程转储和分析快照保存应用程序运行时环境和配置,并且可以在以后的阶段脱机处理这些内容。
它适用于 Windows、Linux 和 Unix。
Orbit Profiler
使用 Orbit Profiler 可以可视化你的 C/C++ 应用程序并快速发现性能问题。 它是一款调试工具和独立的分析器,旨在帮助开发人员查看和理解复杂应用程序的执行流程。
它可以清晰地显示应用程序内部发生的一切,因此你可以快速消除性能瓶颈并恢复应用程序的高性能。
Orbit Profiler 可以有效地用于任何 C 或 C++ 应用程序,前提是它可以访问 PDB 文件。 接下来,它会在你完成程序下载后开始分析。 该工具跳转到目标进程,将自身挂钩到选定的函数,然后执行分析。
它甚至可以用于优化的最终版本或交付版本。 除了动态插桩之外,Orbit Profiler 还提供了“始终在线”的采样功能,该功能速度快、始终可用且功能强大。
它适用于 Windows 和 Linux。
Uber JVM Profiler
Uber JVM Profiler 配备了高级分析功能,是基于 Java 的应用程序的另一个不错的选择。
它提供了一个 Java 代理,用于以分布式方式收集 Spark/Hadoop JVM 进程的多个堆栈跟踪和指标,例如,内存/CPU/IO 指标。
该工具可以在不更改用户代码的情况下跟踪 Java 参数和方法。 你还可以使用它来跟踪每个 Spark 应用程序的 HDFS 名称节点的调用延迟并查找问题。 它甚至可以跟踪 Spark 应用程序的 HDFS 文件路径以找出热点文件并进行进一步的优化。
Uber JVM Profiler 最初是为了分析 Spark 应用程序而创建的,这些应用程序通常涉及一个应用程序的许多机器或进程。 因此,人们可以轻松地将这些机器或进程的指标关联起来。
但是,该工具作为典型的 Java 代理工作,你可以将其用于任何 JVM 进程。 其功能包括:
- 调试 Spark 应用执行器的内存使用情况,如 Java 堆内存、本机内存、非堆内存、缓冲池、内存池
- 调试 CPU 使用率和垃圾回收时间
- 调试 Java 类方法的频率和时间或持续时间分析
- 参数分析(调试和跟踪 Java 类方法调用及其参数值)
- CPU 时间的堆栈跟踪分析并生成火焰图
- 调试 I/O 指标和 JVM 线程指标
Tracy
Tracy 是一款有用的工具,可帮助开发人员轻松调试 PHP 程序。 它具有友好的设计和高级功能,例如 CLI 支持、调试 AJAX 调用等。
它可以快速查找和纠正错误、转储变量、记录错误、可视化内存消耗以及确定查询或脚本的执行时间。 使用颜色编码并以红色突出显示问题,并附带清晰的解释,它可以帮助你轻松可视化异常和错误并理解它们。
Tracy 具有日志记录功能和环境自动检测。 它将数据存储到日志文件中,并在停机期间向访问者显示服务器错误消息。 Tracy 还可以与 Drupal 7、OpenCart、WordPress 等集成。
vprof
vprof 是 Python 应用程序的可视化分析器。 它为 Python 程序的内存使用情况和运行时间等不同特征提供丰富的交互式可视化效果。
它在 BSD 许可下可用,并且支持 Python 3.4 及更高版本。
结论
应用程序性能是满足最终用户期望的关键因素。 如果出现性能问题,你必须准备好在影响用户体验之前诊断问题。
因此,请继续优化你的应用程序并立即解决问题,以便使用本文中提到的工具继续为用户提供超快的应用程序性能。
以下是一个快速比较表,显示了上述分析器及其主要用途。
名称 | 语言 |
py-spy | Python |
Pyroscope | Python, Ruby, Go |
Bubbleprof | Node.js |
Pyinstrument | Python |
Xdebug | PHP |
SPX | PHP |
Prefix | Python, .NET, Java, Node.js, Ruby, PHP |
Scalene | Python |
VisualVM | Java |
Orbit Profiler | C, C++ |
Uber JVM Profiler | Java |
Tracy | PHP |
vprof | Python |