性能分析之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 ...
随机推荐
- 【python】Leetcode每日一题-最长公共子序列
[python]Leetcode每日一题-最长公共子序列 [题目描述] 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度.如果不存在 公共子序列 ,返回 0 . ...
- 使用乌龟Git连接github
之前自己是在Gitee+乌龟Git来进行管理项目,因为特殊的需求,需要再Github+乌龟Git来进行管理项目,这盘博客主要讲解的就是这个. 安装环境 Git 安装参考链接:https://www.c ...
- MySQL 8.0配置文件my.ini文件位置
文件位置 C:\ProgramData\MySQL\MySQL Server 8.0 如果看不到ProgramData文件夹,可能是被隐藏了.打开显示隐藏文件夹选项即可
- Spring Cloud Alibaba(9)---Sentinel概述
Sentinel概述 随着微服务的流行,服务和服务之间的稳定性变得越来越重要.Sentinel是面向分布式服务架构的流量控制组件,主要以流量为切入点,从限流.流量整形.熔断降级.系统自适应保护.热点防 ...
- [拒绝Visual Studio] 团队博客目录
零.项目展示 Alpha版本项目展示 Beta版本项目展示 一.Scrum Meeting 会议记录 1. Alpha阶段 总体时间安排(粗略): 全部原始会议记录请移步 Google Docs ,这 ...
- EasyBPM打印模板的缓存问题
业务平台EasyBPM(易实管理软件)有一个功能是模板打印的功能.就是可以使用一个docx格式的模板,输出一个docx格式的单据的文档. 打印的逻辑是先从服务端获取模板,如果没有对应的模板,就提示先上 ...
- [bug] java.sql.SQLException: Unknown initial character set index '255' received from server. Initial cl...
参考 https://www.jianshu.com/p/d86de6463cbd
- MySQL配置HeartBeat实现心跳监控和浮动IP
1. 初始化环境配置 /sbin/chkconfig --add mysqld /sbin/chkconfig mysqld on ln -s /usr/local/mysql/bin/mysql / ...
- Windows 常用Cmd命令行 (持续更新...)
查看IP ipconfig 查看WIFI密码 netsh wlan show profiles wifi_name key = clear 系统探针 systeminfo CMD重定向 输出符号> ...
- Linux进阶之环境变量文件/etc/profile、/etc/bashrc、/etc/environment
一.Centos 环境变量/etc/profile和/etc/profile.d 1.两个文件都是设置环境变量的文件. 2./etc/profile 是永久性的环境变量,是全局变量,/etc/prof ...