服务器端Swift的火焰图

火焰图是性能概要分析数据的强大可视化形式,通常用于帮助分析复杂应用程序的CPU使用率。 它们由布伦丹·格雷格(Brendan Gregg)推广,他拥有一个不错的网站,向他们解释了所有相关信息。

这是如何生成服务器端Swift应用程序的火焰图。 就我而言,我正在对Kitura进行性能分析,但是我认为该指南适用于任何服务器端Swift应用程序。

整个过程的大部分过程都是正确地设置您的系统-希望这些信息对我来说对其他人有用!

我正在使用Ubuntu 16.04(Xenial)。 我不会尝试使用任何较旧的版本,因为perf分析器正常工作可能很棘手,但是较新的版本应该没问题。

首先,您需要在apt安装中添加一些额外的Ubuntu软件包存储库-我们需要安装的某些软件包未包含在默认存储库中。

/etc/apt/sources.list.d/ddebs.list添加三行:

  deb http://ddebs.ubuntu.com xenial主要受限宇宙multiverse 
deb http://ddebs.ubuntu.com xenial-updates主要受限制的宇宙multiverse
deb http://ddebs.ubuntu.com xenial建议的主要受限宇宙multiverse

将Ubuntu调试符号签名密钥添加到您的受信任密钥中,并重新同步程序包索引文件:

  sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys C8CAB6595FDFF622sudo apt-get更新 

现在,您可以为特定的内核安装性能分析器:

 须藤apt-get install linux-tools-$(uname -r) 

您可以通过运行sudo perf record /bin/true来验证perf是否正常工作。 您应该看到类似以下内容:

  [性能记录:唤醒1次以写入数据] 
[性能记录:捕获并写入0.010 MB性能数据(4个样本)]

(如果收到有关kptr_restrict的错误消息,请尝试允许访问内核地址映射: echo 0 | sudo tee /proc/sys/kernel/kptr_restrict )。

像Kitura这样的服务器端Swift应用程序通常需要一些额外的系统软件包。 您可以将它们安装在一个命令中:

 须藤apt-get install clang   libicu-dev libcurl4-openssl-dev libssl-dev 

您还可以安装wrk加载驱动程序:

 须藤apt-get install wrk 

Perf将从计算机上正在运行的进程中抽样调用堆栈。 为了确保可以将堆栈帧解码为人类可读的格式,最好为某些关键软件包安装调试符号:

  #Linux内核的符号 
sudo apt-get install linux-image-$(uname -r)-dbgsym#libc的符号
sudo apt-get install libc6-dbgsym#基本OS工具(ls,cat等)的符号
sudo apt-get install coreutils-dbgsym#clang的符号,包括libatomic
须藤apt-get install clang-3.8-dbgsym

要分析您的应用程序,您需要同时运行三件事:

  1. 服务器端Swift应用程序
  2. wrk负载驱动程序
  3. 性能分析器

希望运行您的应用程序很容易! 确保在调试模式下而不是发布模式下对其进行编译( swift build不是swift build -c release )。

使用的wrk命令取决于要驱动加载的应用程序中的哪个URL。 对我来说,这是:

  wrk --timeout 30 -t16 -c128 -d60s http://127.0.0.1:8080/ 

这将使用128个并发连接在16个线程上驱动负载,持续60秒。

我使用的perf命令是:

  sudo性能记录-F 99 -a --call-graph矮人-睡眠30 

这将每秒在所有CPU(包括DWARF生成的回溯)上每秒99次对调用堆栈进行采样,持续30秒。 完成后,您应该在当前目录中有一个名为perf.data的文件。

现在最有趣的部分-生成火焰图。 首先,从GitHub克隆FlameGraph项目:

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

然后生成火焰图:

  sudo性能脚本|  ./FlameGraph/stackcollapse-perf.pl | 迅速脱胶|  ./FlameGraph/flamegraph.pl> flamegraph.svg 

通过swift-demangle的中间管道可确保Swift函数名称可读—非常重要!

拥有flamegraph.svg文件后,您可以在任何SVG查看器中打开它。 我将其拖放到Chrome浏览器标签上。 点击放大!

这是我的服务器端Swift火焰图之一的屏幕截图-它们对于研究性能问题非常有用。

Interesting Posts