# 如何定位问题
一个正常的火焰图,应该呈现出如[官网](http://openresty.org/download/user-flamegraph.svg)给出的样例(官网的火焰图是抓C级别函数):![正常](https://box.kancloud.cn/2015-08-11_55c9ff5840c23.png)
从上图可以看出,正常业务下的火焰图形状类似的“山脉”,“山脉”的“海拔”表示worker中业务函数的调用深度,“山脉”的“长度”表示worker中业务函数占用cpu的比例。
下面将用一个实际应用中遇到问题抽象出来的示例(CPU占用过高)来说明如何通过火焰图定位问题。
问题表现,nginx worker运行一段时间后出现CPU占用100%的情况,reload后一段时间后复现,当出现CPU占用率高情况的时候是某个worker 占用率高。
问题分析,单worker cpu高的情况一定是某个input中包含的信息不能被lua函数以正确地方式处理导致的,因此上火焰图找出具体的函数,抓取的过程需要抓取C级别的函数和lua级别的函数,抓取相同的时间,两张图一起分析才能得到准确的结果。
抓取步骤:
1. [安装SystemTap](#);
1.
获取CPU异常的worker的进程ID;
> ps -ef | grep nginx
1.
使用[ngx-sample-lua-bt](https://github.com/openresty/nginx-systemtap-toolkit)抓取栈信息,并用fix-lua-bt工具处理;
> ./ngx-sample-lua-bt -p 9768 --luajit20 -t 5 > tmp.bt
./fix-lua-bt tmp.bt > a.bt
1.
使用[stackcollapse-stap.pl和](https://github.com/brendangregg/FlameGraph);
> ./stackcollapse-stap.pl a.bt > a.cbt
./flamegraph.pl a.cbt > a.svg
1. a.svg即是火焰图,拖入浏览器即可:
![problem](https://box.kancloud.cn/2015-08-11_55c9ff58cfe36.png)
1. 从上图可以清楚的看到get_serial_id这个函数占用了绝大部分的CPU比例,问题的排查可以从这里入手,找到其调用栈中异常的函数。
ps:一般来说一个正常的火焰图看起来像一座座连绵起伏的“山峰”,而一个异常的火焰图看起来像一座“平顶山”。
- 序
- Lua简介
- Lua环境搭建
- 基础数据类型
- 表达式
- 控制结构
- if/else
- while
- repeat
- 控制结构for的使用
- break,return
- Lua函数
- 函数的定义
- 函数的参数
- 函数的返回值
- 函数回调
- 模块
- String库
- Table库
- 日期时间函数
- 数学库函数
- 文件操作
- 元表
- 面向对象编程
- FFI
- LuaRestyRedisLibrary
- select+set_keepalive组合操作引起的数据读写错误
- redis接口的二次封装(简化建连、拆连等细节)
- redis接口的二次封装(发布订阅)
- pipeline压缩请求数量
- script压缩复杂请求
- LuaCjsonLibrary
- json解析的异常捕获
- 稀疏数组
- 空table编码为array还是object
- 跨平台的库选择
- PostgresNginxModule
- 调用方式简介
- 不支持事务
- 超时
- 健康监测
- SQL注入
- LuaNginxModule
- 执行阶段概念
- 正确的记录日志
- 热装载代码
- 阻塞操作
- 缓存
- sleep
- 定时任务
- 禁止某些终端访问
- 请求返回后继续执行
- 调试
- 调用其他C函数动态库
- 我的lua代码需要调优么
- 变量的共享范围
- 动态限速
- shared.dict 非队列性质
- 如何添加自己的lua api
- 正确使用长链接
- 如何引用第三方resty库
- 使用动态DNS来完成HTTP请求
- 缓存失效风暴
- Lua
- 下标从1开始
- 局部变量
- 判断数组大小
- 非空判断
- 正则表达式
- 不用标准库
- 虚变量
- 函数在调用代码前定义
- 抵制使用module()函数来定义Lua模块
- 点号与冒号操作符的区别
- 测试
- 单元测试
- API测试
- 性能测试
- 持续集成
- 灰度发布
- web服务
- API的设计
- 数据合法性检测
- 协议无痛升级
- 代码规范
- 连接池
- c10k编程
- TIME_WAIT问题
- 与Docker使用的网络瓶颈
- 火焰图
- 什么时候使用
- 显示的是什么
- 如何安装火焰图生成工具
- 如何定位问题