亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial Internet of Things >> 物联网技术

使用 Perf 分析分布式应用程序

我和许多开发人员一样,遇到过需要采用现有应用程序并使其更快的情况——主要是通过删除慢代码并用快速代码替换它。我现在知道在优化代码时要遵循一个简单的规则:

我认为会减慢应用程序速度的任何代码都是我应该最后查看的地方。

分析是一种交易,可以让您很快接受直觉的局限性。我很早就意识到我需要冷酷的测量来告诉我代码的哪些部分需要优化。幸运的是,有大量可用的分析工具可以衡量与代码运行方式相关的任何事情。

然而,工具并不一定会使分析变得容易。解释测量值可能很棘手,并且在进行实验时需要严格控制变量。特别是,多线程和分布式应用程序很难分析。

任何不得不调试竞争条件的人都会熟悉多线程应用程序的行为对时间的敏感程度。分析多线程应用程序也有类似的挑战,因为时间成为测量中的一个重要因素。

诸如 callgrind 之类的分析器会显着降低您的程序速度,从而影响计时。显示此类分析器局限性的一个示例是互斥量争用。您的应用程序可能运行缓慢,因为互斥量被大量使用,导致您的代码在锁定功能上花费大量时间。像 callgrind 这样的工具不会显示这一点,因为它计算指令 ,不是时候。

还有另一类分析器可以进行“统计分析”。这些分析器允许您像往常一样运行程序,同时定期获取应用程序花费时间的快照。这些分析器需要运行一段时间才能产生准确的结果,但对时间的影响最小。这使它们非常适合分析多线程和/或分布式应用程序!

我想分享一个使用 Linux perf 工具的分析工作流,我发现它特别有用,因为它可以让我快速识别性能“热点”。我将使用 RTI Connext 5.3.0 中的 c/hello_dynamic 示例作为衡量性能的目标。

首先,确保您的 Linux 机器上安装了 perf。在 Ubuntu 上,我必须运行这个命令才能在我的机器上安装 perf:

sudo apt-get install linux-tools-common linux-tools-3.13.0-107-generic

接下来,您需要下载一个 GitHub 项目,该项目可以将 perf 的输出转换为所谓的“FlameGraph”,它是收集的分析数据的可视化表示。从方便访问的位置(例如您的主目录)运行此命令:

git clone https://github.com/brendangregg/FlameGraph

现在导航到 rti_workspace/examples/c 文件夹中的 hello_dynamic 示例。使用这些命令构建代码(确保 NDDSHOME 设置为 RTI Connext 安装):

导出调试=1 
make -f makefile_Hello_x64Linux3gcc4.8.2

生成文件名称中的平台可能与您的平台不同。请注意我们如何设置 DEBUG 环境变量。我们这样做是为了让二进制文件具有调试符号,这将使我们能够看到 perf 输出的调用堆栈中的函数名称。

我们现在可以在我们的代码上运行 perf。运行以下命令:

objs/x64Linux3gcc4.8.2/Hello sub &
sudo perf record -g objs/x64Linux3gcc4.8.2/Hello pub

一段时间后,点击 control-C 退出发布者。 Perf 将生成一个名为“perf.out”的文件。我们现在需要使用 FlameGraph 存储库中的脚本将此文件转换为 FlameGraph 工具可以理解的内容:

perf 脚本 -f | ~/FlameGraph/stackcollapse-perf.pl> out.perf-folded

从这里,我们可以生成 FlameGraph 图像:

~/FlameGraph/flamegraph.pl out.perf-folded> perf.svg

当您在网络浏览器中打开 perf.svg 文件时,它应该如下所示:


横轴表示在特定函数中花费的时间,而堆叠条表示应用程序的调用堆栈。您可以单击每个条来放大该特定堆栈。

尝试重新运行发布者,但没有订阅者。您会注意到火焰图的右侧部分将消失,因为当没有订阅者时 DDS 不会发送任何数据!

perf 工具可以做的比本博客描述的要多得多。如果您知道其他使您的分析工作更轻松的设置或工具,请告诉我们!

快乐分析!


物联网技术

  1. 钼会与其他元素结合吗?
  2. 使用以太坊和 Google 构建混合区块链/云应用程序
  3. 使用 React Native 和 AWS 构建无服务器移动应用程序
  4. 简单的接近传感器电路和应用
  5. 具有应用程序的模拟和数字传感器的类型
  6. 4 个您可能想要使用其他协议构建的 ZigBee 应用程序
  7. 使用 tinyML 和自动化机器学习构建有效的物联网应用
  8. Microchip:使用 COTS 到抗辐射核心 MCU 扩展空间应用
  9. 简单地消除 IT 瓶颈:低代码平台是关键
  10. Ovo 通过 VCharge 智能电网购买提升其分布式能源游戏
  11. CNC 木材路由器 - 具有令人惊叹的应用程序
  12. 5 AI 在医学中的实际应用(附示例)