写在前面:
systemtap依赖的debuginfo可以从这里(http://debuginfo.centos.org/6/x86_64/)找到,如果幸运的话,你可以直接yum install kernel-debuginfo kernel-debuginfo-common来安装;
不过,正确的安装姿势应该是:
- yum update kernel-* (没有这个将可能出现很多不必要的麻烦)
- reboot
- yum install systemstap
- stap-prep
话说systemtap是一个非常强悍的linux调试工具,但是似乎并不是特别的常用,今天尝试用了一下,确实有一些心得。
安装:
1 |
yum install systemtap |
然后就有systap命令了,弄个脚本试试跑跑吧:
1 |
stap -e 'probe begin { log("hello world") exit() }' |
有错误了:
1 2 |
Checking "/lib/modules/2.6.32-431.el6.x86_64/build/.config" failed with error: 没有那个文件或目录 Incorrect version or missing kernel-devel package, use: yum install kernel-devel-2.6.32-431.el6.x86_64 |
大致如上,可能版本号有所差异;好歹有提示,那就照做;不过,可能你确实已经安装了对应版本的kernel-devel; 你们不防rpm -ql kernel-devel 看看安装到哪里了,如果是 /usr/src/kernels/2.6.32-431.el6.x86_64 那么不妨执行:
1 |
ln -s /usr/src/kernels/2.6.32-431.el6.x86_64 /lib/modules/2.6.32-431.el6.x86_64/build |
其实可以这样:
1 |
stap-prep |
该命令可以帮你安装需要的依赖,主要是kernel-devel 和 kernel-debuginfo; 关键是要安装指定的版本,版本错了不行,如果使用的是本地的yum源,可能找不到指定的版本号的包,这样可以修改为使用官方的yum源,这可能是一个比较慢的过程,因为kernel-debuginfo 大小可能超过1G;单从这个来看,该工具的使用成本还是不小的; 也很有可能你配置了debuginfo的yum源,但是没有enable,可以在yum时候临时enable一下,eg:
1 |
yum --enablerepo=*-debuginfo install kernel-debuginfo-3.10.0-327.13.1.el7.x86_64 |
安装完后再次执行:
1 |
stap -e 'probe begin { log("hello world") exit() }' |
果然有hello world输出,再来一个 profile.stp:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
global syscalllist probe begin { printf("System Call Monitoring Started (10 seconds)...\n") } probe syscall.* { syscalllist[pid(), execname()]++ } probe timer.ms(10000) { foreach ( [pid, procname] in syscalllist ) { printf("%s[%d] = %d\n", procname, pid, syscalllist[pid, procname] ) } exit() } |
使用场景
- 看看哪个进程在查询dns
dns.stp:
12345probe udp.sendmsg {if ( dport == 53 ) {printf ("PID %5d (%s) sent UDP to %15s 53\n", pid(), execname(), daddr)}}
参考资料:
- http://www.ibm.com/developerworks/cn/linux/l-systemtap/
- https://sourceware.org/systemtap/wiki/SystemtapOnFedora
- http://blog.sina.com.cn/s/blog_5311ad2d0102v9gd.html
- systemtap tapset reference:
- systemtap安装:http://www.cnblogs.com/hazir/p/systemtap_introduction.html
- nginx-systemtap-toolkit:https://github.com/openresty/nginx-systemtap-toolkit
- stap++:https://github.com/openresty/stapxx
- FlamgGraph tools:https://github.com/brendangregg/FlameGraph
- http://webcave.us/?p=341