linux系统分析工具续-SystemTap和火焰图(Flame Graph)

本文为网上各位大神文章的综合简单实践篇,参考文章较多,有些总结性东西,自认暂无法详细写出,建议读文中列出的参考文档,相信会受益颇多。下面开始吧(本文出自 “cclo的博客” 博客,请务必保留此出处http://xuclv.blog.51cto.com/5503169/1184517)
SystemTap简介:
  SystemTap provides free software (GPL) infrastructure to simplify the gathering of information about the running Linux system. This assists diagnosis of a performance or functional problem. SystemTap eliminates the need for the developer to go through the tedious and disruptive instrument, recompile, install, and reboot sequence that may be otherwise required to collect data.SystemTap provides a simple command line interface and scripting language for writing instrumentation for a live running system. We are publishing samples, as well as enlarging the internal "tapset" script library to aid reuse and abstraction.
  详情参考:

http://sourceware.org/systemtap/wiki

http://www.ibm.com/developerworks/cn/linux/l-systemtap/

http://blog.yufeng.info/archives/855

火焰图简介:
  通过性能分析来确定什么原因导致CPU繁忙是日常工作中长做的事情,这往往会涉及到栈性能分析。通过定期采样的方式来确定哪些代码是导致CPU繁忙的原因是一个比较粗糙的方法。一个更好的方式是创建一个定时中断来收集程序运行时的计数,函数地址,甚至整个堆栈回溯,最后打印为我们可阅读的报告.我们常用的性能分析工具有oprofile,gprof,dtracesystemtap 等Flame Graph:火焰图,是一个把采样所得到的堆栈跟踪可视化展示的工具。它是基于上面提到的性能分析工具的结果,Flame graph本身并不具备性能检测的能力。
  参考:

https://github.com/brendangregg/FlameGraph

http://dtrace.org/blogs/brendan/2011/12/16/flame-graphs/

http://dtrace.org/blogs/brendan/2012/03/17/linux-kernel-performance-flame-graphs/

systemtap安装及生成nginx的火焰图:
  OS:ubuntu12.10 				#支持uprobes机制systemtap:2.1					#尽少的bug
1> 安装systemtap,这里源码编译
  1:安装编译环境:$ sudo apt-get install build-essential
  2:安装systemtap$ wget http://sourceware.org/systemtap/ftp/releases/systemtap-2.1.tar.gz$ tar zxvf systemtap-2.1.tar.gz$ sudo ./configure -prefix=/opt/systemtap -disable-docs -disable-publican -disable-refdocs如报以下错:configure: error: missing elfutils development headers/libraries (install elfutils-devel, libebl-dev, libdw-dev and/or libebl-devel$ sudo apt-get install libdw-dev      #其实缺的该是libdw1这个包,按提示安装libdw-dev罢了,另三个包都木有$ sudo make$ sudo make install
  3:创建个软链接:$ sudo ln -s /opt/systemtap/bin/stap /usr/sbin/stap
2> 安装debug packages (Kernel debug info packages on Ubuntu, which will aid in providing information for bugs)
  1:$ uname -r3.5.0-17-generic
  2:在http://ddebs.ubuntu.com/pool/main/l/linux/网址找到对应内核的的debug packages,下载并安装之$ sudo dpkg -i linux-image-3.5.0-17-generic-dbgsym_3.5.0-17.28_amd64.ddeb
如没有找到自己系统对于的debug packages,建一个,方法如下:(How do I build a debuginfo kernel if one isn't available?)(官网原文,本文不涉及)$ cd $HOME$ sudo apt-get install dpkg-dev debhelper gawk$ mkdir tmp$ cd tmp$ sudo apt-get build-dep --no-install-recommends linux-image-$(uname -r)$ apt-get source linux-image-$(uname -r)$ cd linux-2.6.31 (this is currently the kernel version of 9.10)$ fakeroot debian/rules clean$ AUTOBUILD=1 fakeroot debian/rules binary-generic skipdbg=false$ sudo dpkg -i ../linux-image-debug-2.6.31-19-generic_2.6.31-19.56_amd64.ddeb
3> 测试systemtap,出现hello world,安装完成
   $ sudo stap -e 'probe kernel.function("sys_open") {log("hello world") exit()}'
4> systemtap安装参考:

 

http://sourceware.org/systemtap/wiki/SystemtapOnUbuntu

https://wiki.ubuntu.com/Kernel/Systemtap

http://www.dcshi.com/?p=124

5> 安装LNMP(非必须,安装nginx即可)
   $ sudo apt-get install nginx mysql-server mysql-client php5 php5-fpm php5-mysql
   $ sudo vim /etc/nginx/sites-enabled/default     #启用下面几行
  1. location ~ \.PHP$ {

  2.        fastcgi_split_path_info ^(.+\.php)(/.+)$;

  3. #       # NOTE: You should have "cgi.fix_pathinfo = 0;"in php.ini

  4. #

  5. #       # With php5-cgi alone:

  6. #       fastcgi_pass 127.0.0.1:9000;

  7. #       # With php5-fpm:

  8.        fastcgi_pass unix:/var/run/php5-fpm.sock;

  9.        fastcgi_index index.php;

  10.        include fastcgi_params;

  11. }

   $ sudo vim /usr/share/nginx/www/index.php       #随便建个测试页
  1. <html><body><h1>It is my works!!</h1></body></html>

  2. <?php

  3. $link=mysql_connect('localhost','root','root');

  4. if ($link)

  5.    echo "Success";

  6. else

  7.    echo "Failure";

  8. mysql_close();

  9. phpinfo();

  10. ?>

   访问http://192.168.1.94/	                  #访问确保正常 
6> 用systemtap进行nginx的分析,并用flameGraph画出相应的火焰图。
   1:编写systemtap脚本: vim ngx.stp
  1. global s;

  2. global quit = 0;

  3. probe timer.profile {

  4.    if (pid() == target()) {

  5.        if (quit) {

  6.            foreach (i in s-) {

  7.                print_ustack(i);

  8.                printf("\t%d\n", @count(s[i]));

  9.            }

  10.            exit()

  11.        } else {

  12.            s[ubacktrace()] <<< 1;

  13.        }

  14.    }

  15. }

  16. probe timer.s(20) {

  17.    quit = 1

  18. }

   2:执行如下命令:
   $ sudo stap --ldd -d /usr/sbin/nginx --all-modules -D MAXMAPENTRIES=256 -D MAXACTION=20000 -D MAXTRACE=100 -D MAXSTRINGLEN=4096 -D MAXBACKTRACE=100 -x 2082 ngx.stp --vp 0001 > ngx.out可能需修改的地方:/usr/sbin/nginx 	             #nginx的安装位置,一般是此-D MAXMAPENTRIES=256 	     #本机是个虚拟机,只给了其512M内存,为了保证内存不溢出,设为256-x 2082			     #指定其中一个nginx worker进程的pid在执行以上命令的同时保证对nginx的压力测试,另开终端执行:$ ab -n 900000 -c 50 http://192.168.1.94/index.php
   $ perl stackcollapse-stap.pl ngx.out > ngx.out2
   $ perl flamegraph.pl ngx.out2 > ngx.svg#以上2个perl脚本在https://github.com/brendangregg/FlameGraph
7> 访问192.168.1.94/ngx.svg        #火焰图出炉了

   每个框代表一个栈里的一个函数Y轴代表栈深度(栈桢数)。最顶端的框显示正在运行的函数,这之下的框都是调用者。在下面的函数是上面函数的父函数X轴代表采样总量。从左到右并不代表时间变化,从左到右也不具备顺序性框的宽度代表占用CPU总时间。宽的框代表的函数可能比窄的运行慢,或者被调用了更多次数。框的颜色深浅也没有任何意义如果是多线程同时采样,采样总数会超过总时间
8> 可能遇到的问题:
  1:如果有类似如下行,执行 $ sudo rm .systemtap -rfPass 4: using cached /home/ubuntu/.systemtap/cache/24/stap_2479e8647ccf262def735ebf0eeb57c5_5866.ko
  2:如果有类似如下行,那应该有指望Pass 4: compiled C into "stap_2711449662ecf03b09d98a743c2122d0_5946.ko" in 24060usr/6960sys/103610rea
  3:如果有类似如下行,可以考虑忽略下WARNING: Missing unwind data for module, rerun with 'stap -d stap_2711449662ecf03b09d98a743c2122d0_3437'
  4:如果火焰图只出现大量的init函数,说明完全不正确,暂不知道怎么解决,nginx如果是apt-get安装,尝试执行如下行,可能有用$ sudo apt-get install nginx-full-dbg 
  5:WARNING: missing unwind/symbol data for module 'kernel' :user-space facilities not available without kernel CONFIG_UTRACE 这个错误是说你的 kernel 没有提供 utrace/uprobes 用户态支持。两种解法:1. 自己给Ubuntu自带的老kernel应用utrace补丁,并重新编译它。chaoslawful老师写过一篇博客分享过ubuntu上的步骤:http://chaoslawful.iteye.com/blog/14635642. 将kernel升级到官方最新的3.5或以上的版本。最新的kernel默认包含了uprobes机制,不再需要utrace补丁了(这是为什么用ubuntu12.10的原因)
9> 火焰图生成参考的文档:

http://www.dcshi.com/?p=287

https://groups.google.com/forum/#!msg/openresty/u-puKWWONMk/bxsyQdWMkJIJ

http://idning.github.io/systemtaprst.html

附:
$ stap -h
Systemtap translator/driver (version 2.1/0.153, non-git sources)
Copyright (C) 2005-2013 Red Hat, Inc. and others
This is free software; see the source for copying conditions.
enabled features: TR1_UNORDERED_MAP NLSUsage: stap [options] FILE         Run script in file.or: stap [options] -            Run script on stdin.or: stap [options] -e SCRIPT    Run given script.or: stap [options] -l PROBE     List matching probes.or: stap [options] -L PROBE     List matching probes and local variables.Options (in /home/ubuntu/.systemtap/rc and on command line):--         end of translator options, script options follow-h --help  show help-V --version  show version-p NUM     stop after pass NUM 1-5, instead of 5			(parse, elaborate, translate, compile, run)-v         add verbosity to all passes--vp {N}+  add per-pass verbosity [00000]-k         keep temporary directory-u         unoptimized translation -w         suppress warnings -W         turn warnings into errors -g         guru mode -P         prologue-searching for function probes -b         bulk (percpu file) mode -s NUM     buffer size in megabytes, instead of 0-I DIR     look in DIR for additional .stp script files, in addition to/opt/systemtap/share/systemtap/tapset-D NM=VAL  emit macro definition into generated C code-B NM=VAL  pass option to kbuild make--modinfo NM=VALinclude a MODULE_INFO(NM,VAL) in the generated C code-G VAR=VAL set global variable to value-R DIR     look in DIR for runtime, instead of/opt/systemtap/share/systemtap/runtime-r DIR     cross-compile to kernel with given build tree; or else-r RELEASE cross-compile to kernel /lib/modules/RELEASE/build, instead of/lib/modules/3.5.0-17-generic/build-a ARCH    cross-compile to given architecture, instead of x86_64-m MODULE  set probe module name, instead of stap_4736-o FILE    send script output to file, instead of stdout. This supportsstrftime(3) formats for FILE-c CMD     start the probes, run CMD, and exit when it finishes-x PID     sets target() to PID-F         run as on-file flight recorder with -o.run as on-memory flight recorder without -o.-S size[,n] set maximum of the size and the number of files.-d OBJECT  add unwind/symbol data for OBJECT file--ldd      add unwind/symbol data for all referenced object files.--all-modulesadd unwind/symbol data for all loaded kernel objects.-t         collect probe timing information--runtime=MODEset the pass-5 runtime mode, instead of kernel--privilege=PRIVILEGE_LEVELcheck the script for constructs not allowed at the given privilege level--unprivilegedequivalent to --privilege=stapusr--compatible=VERSIONsuppress incompatible language/tapset changes beyond VERSION,instead of 2.1--check-versiondisplays warnings where a syntax element may be version dependent--skip-badvarssubstitute zero for bad context $variables--suppress-handler-errorscatch all runtime errors, quietly skip probe handlers--use-server[=SERVER-SPEC]specify systemtap compile-servers--list-servers[=PROPERTIES]report on the status of the specified compile-servers:all,specified,online,trusted,signer,compatible--remote=HOSTNAMErun pass 5 on the specified ssh host.may be repeated for targeting multiple hosts.--remote-prefixprefix each line of remote output with a host index.--tmpdir=NAMEspecify name of temporary directory to be used.--download-debuginfo[=OPTION]automatically download debuginfo using ABRT.yes,no,ask,<timeout value>--dump-probe-typesshow a list of available probe types.--sysroot=DIRspecify sysroot directory where target files (executables,libraries, etc.) are located.--sysenv=VAR=VALUEprovide an alternate value for an environment variablewhere the value on a remote system differs.  Pathvariables (e.g. PATH, LD_LIBRARY_PATH) are assumed to berelative to the sysroot.--suppress-time-limitsdisable -DSTP_NO_OVERLOAD -DMAXACTION and -DMAXTRYACTION limits本文出自 “cclo的博客” 博客,请务必保留此出处http://xuclv.blog.51cto.com/5503169/1184517

 

转载于:https://www.cnblogs.com/wicub/p/6733094.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/401136.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL8.0.x 版本安装步骤傻瓜式教程【官方版】

Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 MySQL8.0.x 安装 一、下载 MySQL官网下载链接&#xff1a;https://downloads.mysql.com/archives/community/ 选择版本后…

不用电的计算机(二)

Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 转载请注明出处&#xff1a;https://blog.csdn.net/morningli/p/16058594.html 上一篇讲到最早的计算机是什么样的&#xf…

CocoaPods did not set the base configuration of your project 问题解决方案

今天在使用pod install的时候&#xff0c;出现了 [!] CocoaPods did not set the base configuration of your project because your project already has a custom config set. In order for CocoaPods integration to work at all, please either set the base configuration…

在UnityUI中绘制线状统计图

Python微信订餐小程序课程视频 https://blog.csdn.net/m0_56069948/article/details/122285951 Python实战量化交易理财系统 https://blog.csdn.net/m0_56069948/article/details/122285941 先来个效果图 觉得不好看可以自己调整 1.绘制数据点 线状图一般由数据点和连线组…

HTTP 错误 404.3 - Not Found 由于扩展配置问题而无法提供您请求的页面

错误原因为 IIS 扩展信息中午此扩展 标签&#xff1a; 今天&#xff0c;在vs2013中新建了一个placard.json文件&#xff0c;当我用jq读取它的时候&#xff0c;去提示404&#xff0c;直接在浏览器访问这个文件&#xff0c;提示&#xff1a; HTTP 错误 404.3 – Not Found 由于扩…

一行代码,让 VS Code 内置 PDF 阅读器变成深色模式

Python微信订餐小程序课程视频 https://blog.csdn.net/m0_56069948/article/details/122285951 Python实战量化交易理财系统 https://blog.csdn.net/m0_56069948/article/details/122285941 许多人会用 VSCode 写 LaTeX&#xff0c;等等&#xff0c;都会用到 PDF 预览。VSCo…

Selenium2Library+ride学习笔记

一、环境部署 1.安装python2.7编译环境、ride环境以及Selenium2Library环境&#xff0c;环境部署可参见前面几节。 2.启动RIDE编译环境&#xff0c;导入Selenium2Library库。     3. 执行F5,可查看Selenium2Library自带的关键字(Keyword)。 二、常用关鍵字解释 1. open b…

Android——线程通讯 Handler、Looper、Message;

线程通讯问题 &#xff08;主要用到了Handler类&#xff0c;Looper类和Message类以及MessageQueue&#xff09; 在Android中主线程如何向子线程中发送消息的问题。让我们来想想&#xff0c;这其中的过程&#xff0c;无非就是创建一个Handler对象&#xff0c;然后一个线程发消息…

Abp 实现通过手机号注册用户

Python微信订餐小程序课程视频 https://blog.csdn.net/m0_56069948/article/details/122285951 Python实战量化交易理财系统 https://blog.csdn.net/m0_56069948/article/details/122285941 前言 Abp 的 Identity 模块&#xff0c;实现了用户的管理&#xff0c;但是对于国…

Exchange 2010 创建设备室邮箱

其实创建设备邮箱和创建会议室邮箱都差不多&#xff0c;只是在新建邮箱的时候&#xff0c;邮箱的类型选择的不一样&#xff1b;1、打开Exchange管理控制台&#xff0c;展开“收件人配置”选择“邮箱”节点&#xff1b;在中间空白的地方右击选择“新建邮箱”&#xff1b;或者在操…

简单的Excel导出(两种方式)

最近项目里面有个周报Excel导出的功能&#xff0c;为了解决这个问题&#xff0c;我显示调研Excel内核的方式实现了&#xff0c;但是被告知该方法有诸多弊端&#xff08;1、服务器需要装相应版本的Excel&#xff1b;2、如果程序中途出错服务器会有很多Excel进程&#xff09;&…

一款开源的文件搜索神器,终于不用记 find 命令了

Python微信订餐小程序课程视频 https://blog.csdn.net/m0_56069948/article/details/122285951 Python实战量化交易理财系统 https://blog.csdn.net/m0_56069948/article/details/122285941 这是 HelloGitHub 推出的《讲解开源项目》系列&#xff0c;用一篇文章带你快速上…

C2审核模式(c2 audit mode)

C2审核模式&#xff08;c2 audit mode&#xff09;SQL Server C2 Audit 是为了满足美国国防部针对计算机的安全访问的安全评级要求而引入的。 SQL C2Audit 可以记录shutdown,restart,成功和失败的Login,成功或者失败访问数据库对象&#xff0c;所欲数据定义的执行&#xff0c;数…

开发者必读:2022年移动应用趋势洞察白皮书

Python微信订餐小程序课程视频 https://blog.csdn.net/m0_56069948/article/details/122285951 Python实战量化交易理财系统 https://blog.csdn.net/m0_56069948/article/details/122285941 华为开发者联盟与艾瑞咨询联合发布《2022年移动应用趋势洞察白皮书》&#xff0c;本…

Java 阶段面试 知识点合集 - 我们到底能走多远系列(15)

我们到底能走多远系列&#xff08;15&#xff09; 扯淡&#xff1a;这些知识点来源是通过面试涉及到的&#xff0c;面的公司不多&#xff0c;知识点涉及也不多&#xff0c;我每次面试后都在备忘录里写下有用的东西&#xff0c;集合起来分享一下&#xff0c;因为是知识点&#x…

对比学习 ——simsiam 代码解析。

Python微信订餐小程序课程视频 https://blog.csdn.net/m0_56069948/article/details/122285951 Python实战量化交易理财系统 https://blog.csdn.net/m0_56069948/article/details/122285941 ​ 目录 1 &#xff1a; 事先准备 。 2 &#xff1a; 代码阅读。 2.1: 数据读取…

wiki常用语法

为什么80%的码农都做不了架构师&#xff1f;>>> 说明 输入 效果 作用在任何地方 斜体字 斜体字 斜体字 粗体字 粗体字 粗体字 粗体加斜体 粗体加斜体 粗体加斜体 下划线 &#xff08;推荐替代斜体&#xff09; <u>下划线</…

【ASP.NET Web API教程】3.3 通过WPF应用程序调用Web API(C#)

注&#xff1a;本文是【ASP.NET Web API系列教程】的一部分&#xff0c;如果您是第一次看本博客文章&#xff0c;请先看前面的内容。 3.3 Calling a Web API From a WPF Application (C#) 3.3 通过WPF应用程序调用Web API(C#) 本文引自&#xff1a;http://www.asp.net/web-api/…

java开发过程中的命名规范

为什么80%的码农都做不了架构师&#xff1f;>>> 最近在读项目的过程中&#xff0c;发现好多同事的代码并不是很规范&#xff0c;有的包名也按照了驼峰的写法&#xff0c;虽说这样不是不行&#xff0c;但个人认为开发过程中应该遵守这些规范&#xff0c;现整理规范如…

git 使用方法自用(勿进)本地开发分支推上线上开发分支

一、//查看状态 1.git status 二、//查看改了哪个文件夹 1.git diff 2.//会出现改了哪个文件夹src/components/partials/Slider.js 三、//查看改了的文件夹里面具体改了啥内容 1.git diff src/components/partials/Slider.js 四、提交所有 1. git add . 五、写备注…