linux系统分析工具续-SystemTap和火焰图(Flame Graph)
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 #啟用下面幾行location ~ \.PHP$ {
? ? ? ?fastcgi_split_path_info ^(.+\.php)(/.+)$;
# ? ? ? # NOTE: You should have "cgi.fix_pathinfo = 0;"in php.ini
#
# ? ? ? # With php5-cgi alone:
# ? ? ? fastcgi_pass 127.0.0.1:9000;
# ? ? ? # With php5-fpm:
? ? ? ?fastcgi_pass unix:/var/run/php5-fpm.sock;
? ? ? ?fastcgi_index index.php;
? ? ? ?include fastcgi_params;
}
<html><body><h1>It is my works!!</h1></body></html>
<?php
$link=mysql_connect('localhost','root','root');
if ($link)
? ?echo "Success";
else
? ?echo "Failure";
mysql_close();
phpinfo();
?>
global s;
global quit = 0;
probe timer.profile {
? ?if (pid() == target()) {
? ? ? ?if (quit) {
? ? ? ? ? ?foreach (i in s-) {
? ? ? ? ? ? ? ?print_ustack(i);
? ? ? ? ? ? ? ?printf("\t%d\n", @count(s[i]));
? ? ? ? ? ?}
? ? ? ? ? ?exit()
? ? ? ?} else {
? ? ? ? ? ?s[ubacktrace()] <<< 1;
? ? ? ?}
? ?}
}
probe timer.s(20) {
? ?quit = 1
}
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
總結
以上是生活随笔為你收集整理的linux系统分析工具续-SystemTap和火焰图(Flame Graph)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦到捡翡翠什么预兆
- 下一篇: 梦到猴子缠着怎么甩都甩不掉