性能分析之CPU分析-从CPU调用高到具体代码行(C/C++)
今天在培训的过程中,也提到了分析要具体到代码的事情,如果思路方向是正确的,对java应用和C/C++应用来说,也是几个命令就可以跳到代码行了。前提是要能看得懂堆栈信息。所以一直以来我在讲课的过程中都有画过这样的一个分析思路的图。
在性能分析中,如果是C/C++的应用的话,也同样是有些工具可以做得到的。
今天我们来看一个简单的C代码示例,看下如何做到这几步。我在网上看到有一段示例代码,也省得自己写了。就直接拿来编译用了。下面来看一下操作。
[root@7dgroup Sample6]# gcc -o test6 -g test6.c
编译的时候记得加-g的参数,可以生成调试信息。
[root@7dgroup Sample6]# ./test6
运行起来:
[root@7dgroup Sample6]# ./test6
返回值 :3
返回值 5
返回值 :5
返回值 7
返回值 :7
返回值 9
执行过程会产生这样的数据。同时查看top。
看到31356这个进程已经消耗了CPU。因为这个进程非常的简单,所以这里我就不再细化到线程级了。直接打堆栈看了。
(如果是复杂的应用的话,在这一步,还要再细化一步的就是打印线程级的状态。方法有多种,可以用top -H,也可以pidstat,也可以用调试工具attach上去再查threaddump。总之选择自己喜欢的方式就好。)
直接gstack打印堆栈。
[root@7dgroup ~]# gstack 31356
#0 0x00000000004005ed in function2 (input=963) at test6.c:4
#1 0x000000000040065b in function1 (a=9, b=10) at test6.c:21
#2 0x00000000004006e8 in main () at test6.c:39
当然你也可以pstack打印堆栈(因为我重新运行了一次,所以PID变了)。
[root@7dgroup ~]# pstack 31438
#0 0x0000000000400620 in function3 (input=3524) at test6.c:14
#1 0x000000000040067e in function1 (a=5, b=6) at test6.c:25
#2 0x00000000004006e8 in main () at test6.c:39
通过堆栈信息就可以看出来,这里面只有一个线程,并且调用关系是:
第一次打印的堆栈是:39行 -> 21行 -> 4行
第二次打印的堆栈是:39行 -> 25行 -> 14行
(因为是同一个文件,所以我只写行号了)。
这样就可以在C/C++的应用中从CPU分析到具体的代码行了。
再重复强调,分析思路的完整性非常重要。要先知道想看什么数据,才能知道用什么工具去做。会工具没什么了不起,但是把原理搞清楚又能融会贯通才是真的厉害。
可能有人会说,我连工具都不知道怎么用,怎么知道看什么数据呢。看似悖论的一个问题,实际上就是经验不足,需要多学习基础的知识。
比如说,了解了linux上运行java语言的分析过程,那其他的分析过程也是类似的,只是工具不同。并不是说只会分析linux上运行java,换成HPunix+C/C++就没有思路了。
就像小学做的数学题一样:一行有四棵树,总共四行,共有几棵树?16棵! 但是把树换成电线杆就有人不会算了。
性能分析之CPU分析-从CPU调用高到具体代码行(C/C++)的更多相关文章
- 性能分析之CPU分析-从CPU调用高到具体代码行(JAVA)
通常情况下,性能报告中只说CPU使用率高的时候,并不能帮助定位问题.因为CPU高会有多种不同的情况.CPU有五种状态(us sy id wa st), 在vmstat中能显示出来,这个想必很多人都 ...
- Python 获取被调用函数名称,所处模块,被调用代码行
获取被调用函数名称,所处模块,被调用代码行 by:授客 QQ:1033553122 module2.py: #!/usr/bin/env python # -*- coding:utf-8 -*- _ ...
- PC虚拟现实应用的性能分析与优化:从CPU角度切入
如今,虚拟现实 (VR) 技术正日益受到欢迎,这主要得益于遵循摩尔定律的技术进步让这一全新体验在技术上成为可能.尽管虚拟现实能给用户带来身临其境般的超凡体验,但相比传统应用,其具有双目渲染.低延迟.高 ...
- DIY Ruby CPU 分析——Part I
[编者按]原文作者 Emil Soman,Rubyist,除此之外竟然同时也是艺术家,吉他手,Garden City RubyConf 组织者.本文是DIY Ruby CPU Profiling 的第 ...
- DIY Ruby CPU 分析——Part III
[编者按]作者 Emil Soman,Rubyist,除此之外竟然同时也是艺术家,吉他手,Garden City RubyConf 组织者.本文是 DIY Ruby CPU Profiling 的第二 ...
- DIY Ruby CPU 分析 Part II
[编者按]作者 Emil Soman,Rubyist,除此之外竟然同时也是艺术家,吉他手,Garden City RubyConf 组织者.本文是 DIY Ruby CPU Profiling 的第二 ...
- 使用ANTS Performance Profiler&ANTS Memory Profiler工具分析IIS进程内存和CPU占用过高问题
一.前言 最近一段时间,网站经常出现两个问题: 1.内存占用率一点点增高,直到将服务器内存占满. 2.访问某个页面时,页面响应过慢,CPU居高不下. 初步判断内存一点点增多可能是因为有未释放的资源一直 ...
- linux概念之cpu分析
http://ilinuxkernel.com/?cat=4 Linux CPU占用率原理与精确度分析1 CPU占用率计算原理在Linux/Unix 下,CPU 利用率分为用户态.系统态和空闲态,分 ...
- jstack来分析。当linux出现cpu被java程序消耗过高时
我们使用jdk自带的jstack来分析.当linux出现cpu被java程序消耗过高时,以下过程说不定可以帮上你的忙: 1.top查找出哪个进程消耗的cpu高 21125 co_ad2 18 ...
随机推荐
- Node-Web模块
创建服务端------------------------------------------------------ var http = require('http'); var fs = req ...
- ListView 加载数据时 触摸报错
问题起因: 在做一个从sd卡中加载数据显示在ListView中,由于数据可能比较多,考虑到用户体验,就使用AsyncTask来异步加载,数据一条一条的添加至ListView中. 开始数据比较少的时候, ...
- ecloud云主机限速相关配置说明
目前与云主机限速相关的内容共有三处: neutron qos-xxx命令,通过neutron qos的形式为云主机port绑定相应的网络限速策略(对应弹性公网IP) 通过flavor对云主机进行默认限 ...
- 双非硕士的辛酸求职回忆录:第 2 篇 谈谈我是如何同时找到Java、Python、Go等开发岗和国企银行的科技岗位Offer(上篇)
1. 双非硕士的辛酸求职之旅--谈谈我是如何同时找到Java.Python.Go等开发岗和国企银行的offer 1.1. 秋招最终情况 本人情况:双非硕,意向工作城市广深,Java和Python技术栈 ...
- 【微信小程序】--小程序中循环遍历(包括js中遍历和wxml中的遍历)
文章为博主原创,纯属个人见解,如有错误欢迎指出. 如需转载,请注明出处. 在js中遍历 for (var index in res.data.infos) { res.data.infos[index ...
- 安装mysql警告: Header V3 DSA/SHA1 Signature, key ID 5072e1f5: NOKEY
CentOS安装rpm安装MySQL时爆出警告: warning: mysql-community-server-5.7.18-1.el6.x86_64.rpm: Header V3 DSA/SHA1 ...
- 使用TK框架中updateByPrimaryKey与updateByPrimaryKeySelective区别
int updateByPrimaryKey(T var1); int updateByPrimaryKeySelective(T var1); updateByPrimaryKeySelective ...
- opencv——机器视觉检测和计数
引言 在机器视觉中,有时需要对产品进行检测和计数.其难点无非是对于产品的图像分割. 由于之前网购的维生素片,有时候忘了今天有没有吃过,就想对瓶子里的药片计数...在学习opencv以后,希望实现对于维 ...
- 从0开始fastjson漏洞分析2
从0开始fastjson漏洞分析https://www.cnblogs.com/piaomiaohongchen/p/14777856.html 有了前文铺垫,可以说对fastjson内部机制和fas ...
- Django(18)聚合函数
前言 orm模型中的聚合函数跟MySQL中的聚合函数作用是一致的,也有像Sum.Avg.Count.Max.Min,接下来我们逐个介绍 聚合函数 所有的聚合函数都是放在django.db.models ...