服务器端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
要分析您的应用程序,您需要同时运行三件事:
- 服务器端Swift应用程序
-
wrk
负载驱动程序 - 性能分析器
希望运行您的应用程序很容易! 确保在调试模式下而不是发布模式下对其进行编译( 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火焰图之一的屏幕截图-它们对于研究性能问题非常有用。