DEMO:
#include <stdio.h>#include <stdlib.h>void foo3(){}void foo2(){ int i; for(i=0 ; i < 10; i++) foo3();}void foo1(){ int i; for(i = 0; i< 1000; i++) foo3();}int main(void){ int i; for( i =0; i< 1000000000; i++) { foo1(); foo2(); }}DEMO火焰图:

文章插图
9.4.2 off-CPU
cpu过低 , 利用率不高 。等待下一轮CPU , 或者等待I/O、锁、换页等等 , 其状态可以细分为可执行、匿名换页、睡眠、锁、空闲等状态 。
使用方式:
// off-CPU usersh ngx_off_cpu_u.sh pid//进入结果目录cd ngx_off_cpu_u//off-CPU kernelsh ngx_off_cpu_k.sh pid//进入结果目录cd ngx_off_cpu_k//开一个临时端口8088python -m SimpleHTTPServer 8088//打开浏览器输入地址127.0.0.1:8088/pid.svg官网DEMO:

文章插图
9.5 内存级别火焰图
如果线上程序出现了内存泄漏 , 并且只在特定的场景才会出现 。这个时候我们怎么办呢?有什么好的方式和工具能快速的发现代码的问题呢?同样内存级别火焰图帮你快速分析问题的根源 。
使用方式:
sh ngx_on_memory.sh pid//进入结果目录cd ngx_on_memory//开一个临时端口8088python -m SimpleHTTPServer 8088//打开浏览器输入地址127.0.0.1:8088/pid.svg官网DEMO:

文章插图
9.6 性能回退-红蓝差分火焰图
你能快速定位CPU性能回退的问题么? 如果你的工作环境非常复杂且变化快速 , 那么使用现有的工具是来定位这类问题是很具有挑战性的 。当你花掉数周时间把根因找到时 , 代码已经又变更了好几轮 , 新的性能问题又冒了出来 。主要可以用到每次构建中 , 每次上线做对比看 , 如果损失严重可以立马解决修复 。
通过抓取了两张普通的火焰图 , 然后进行对比 , 并对差异部分进行标色:红色表示上升 , 蓝色表示下降 。差分火焰图是以当前(“修改后”)的profile文件作为基准 , 形状和大小都保持不变 。因此你通过色彩的差异就能够很直观的找到差异部分 , 且可以看出为什么会有这样的差异 。
使用方式:
cd quick_location//抓取代码修改前的profile 1文件perf record -F 99 -p pid -g -- sleep 30perf script > out.stacks1//抓取代码修改后的profile 2文件perf record -F 99 -p pid -g -- sleep 30perf script > out.stacks2//生成差分火焰图:./FlameGraph/stackcollapse-perf.pl ../out.stacks1 > out.folded1./FlameGraph/stackcollapse-perf.pl ../out.stacks2 > out.folded2./FlameGraph/difffolded.pl out.folded1 out.folded2 | ./FlameGraph/flamegraph.pl > diff2.svgDEMO:
//test.c#include <stdio.h>#include <stdlib.h>void foo3(){}void foo2(){ int i; for(i=0 ; i < 10; i++) foo3();}void foo1(){ int i; for(i = 0; i< 1000; i++) foo3();}int main(void){ int i; for( i =0; i< 1000000000; i++) { foo1(); foo2(); }}//test1.c#include <stdio.h>#include <stdlib.h>void foo3(){}void foo2(){ int i; for(i=0 ; i < 10; i++) foo3();}void foo1(){ int i; for(i = 0; i< 1000; i++) foo3();}void add(){ int i; for(i = 0; i< 10000; i++) foo3();}int main(void){ int i; for( i =0; i< 1000000000; i++) { foo1(); foo2(); add(); }}DEMO红蓝差分火焰图:

文章插图
10. 案例分析
10.1 接入层Nginx集群异常现象
通过监控插件发现在2017.09.25 19点nginx集群请求流量出现大量的499 , 5xx状态码 。并且发现机器cpu使用率升高 , 目前一直持续中 。
10.2 分析nginx相关指标
a)
推荐阅读
- windows和linux下配置jdk环境
- Linux: 史上最全的sort命令案例,打包带走吧
- 在 Linux 中使用变量
- 如何在 Linux 上创建和使用交换文件
- Linux系统启动时为什么没有最先调用main函数?
- 老年人用智能手机,常见的3个问题,小妙招解决大难题
- 埃及金字塔的问题 埃及金字塔如何修建而成
- 苹果发布各大硬件设备系统升级,主要修复问题
- Linux常用命令:chmod修改文件权限 777和755分别是什么意思?
- 微服务架构下,Mysql读写分离后,数据库CPU飙升卡壳问题解析
