jinhailang / blog

技术博客:知其然,知其所以然
https://github.com/jinhailang/blog/issues
60 stars 6 forks source link

OpenResty 火焰图收集 #25

Open jinhailang opened 6 years ago

jinhailang commented 6 years ago

火焰图可以用来分析程序代码函数层的 CPU 或内存的使用情况,为程序的优化提供很直观的参考。 因此,对一个成熟的项目来说,能够随时收集运行时的火焰图必不可少。

得益于春哥对动态追踪技术的研究(动态追踪技术漫谈建议先看一下),OpenResty 提供了很多调试工具,其中就包括火焰图收集脚本。

火焰图收集流程

  1. 下载 OpenResty 项目源码,编译(configure)带上 --with-debug,开启调试模式编译;

  2. 安装 systemtap,以及内核调试信息,注意要跟内核版本保持一致

    uname -r #查看内核版本
    apt-get install systemtap linux-image-`uname -r`-dbg linux-headers-`uname -r` #自动安装
  3. 下载调试工具 stapxx

    git clone https://github.com/openresty/stapxx.git
    cd ./stapxx
    export PATH=$PWD:$PATH
    • 收集 CPU

      ./samples/lj-lua-stacks.sxx --skip-badvars -x PID > a.bt #PID 即 nginx worker 进程 id
      ./fix-lua-bt a.bt > a.bt #美化数据,去除杂音 https://github.com/openresty/openresty-systemtap-toolkit#fix-lua-bt
    • 收集内存

      ./samples/sample-bt-leaks.sxx -x PID -v > a.bt #PID 即 nginx worker 进程 id
  4. 下载 FlameGraph 将堆栈信息生成火焰图

    tar -zxf FlameGraph.tar.gz
    cd ./FlameGraph
    ./stackcollapse-stap.pl ../stapxx/a.bt > a.cbt
    ./flamegraph.pl --encoding="ISO-8859-1" --title="Lua-land on-CPU flamegraph" a.cbt > a.svg
  5. 使用浏览器打开 a.svg 即可得到火焰图

踩过的坑