在上篇博客中,笔者介绍了如何三种常用的性能分析工具,其中就提到了systemtap及其前端工具stap。想必读者很好奇,既然systemtap功能这么强大,那么该如何安装和使用它呢?
1. systemtap的安装
下面基于笔者的CentOS系统,分享一下自己的安装步骤:
a.如果CentOS自带的yum的源无法联通,在国内可以更新yum.repos.d:
cd /etc/yum.repos.d ;
mv CentOS-Base.repo CentOS-Base.repo.bk ;
wget http://mirrors.163.com/.help/CentOS6-Base-163.repo;
yum makecache
b.在Fedora、CentOS、Redhat上,可以通过下面的命令来安装ststemtap及其依赖的kernel-develope:
yum install systemtap systemtap-runtime
yum install kernel-devel gcc make
如果要对磁盘和网络进行调试,可以安装专门针对这两者的systemap脚本:
yum install tuned-utils-systemtap.noarch
为了使systemtap脚本能够运行,需要安装依赖的内核调试信息包,在现代的OS上可以通过下面的命令一键安装:
stap-prep
如果上面的命令执行失败,很可能需要为当前内核安装相应的package:
yum install kernel-devel-`uname -r`
debuinfo-install kernel-debuginfo-`uname -r`
如果依赖的包已经手动下载了,可以用下面的命令进行安装:
rpm –force -ivh package-names
而在Ubuntu类系统上,可以参考下面的命令进行安装:
apt-get install systemtap
apt-get install linux-headers-generic gcc make
同样也需要准备安装内核调试相关的包:
apt-get install linux-p_w_picpath-debug-generic
ln -s /boot/vmlinux-debug-$(uname -r) \
/lib/modules/$(uname -r)/vmlinux
c.测试是否安装成功
上面的步骤完成之后,可以通过下面的命令来检查安装是否成功:
stap -v -e 'probe vfs.read {printf("read performed\n"); exit()}'
2. systemtap的使用
下面说明几种常用的使用方式:
2.1以模块的方式运行
例如从test.stp生成一个能运行在当前内核上的插桩模块test.ko:
stap -r `uname -r` -e 'probe vfs.read {exit()} -m simple
如果上面命令执行成功,会生成test.ko,为了让它执行期望的探测工作,用staprun命令把它跑起来:
staprun test.ko
2.2 以命令的方式运行
同样完成上面的任务,可以用下面的命令执行执行:
echo “probe vfs.read {exit()} “ | stap -v -
再比如:
stap -v “probe timer.s(1) {exit()} “
2.3 以脚本或命令的方式运行
如果把是上面的“probe probe timer.s(1) {exit()}”写入到test.stp脚本里,就可以按照下面的方式进行执行:
stap -vvv test.stp
这种方式通常可以跟很多选项:
-o file_name 指定输出文件名
-x procss_id 指定探测进程ID为'process_id‘的程序
-e为systemTap translator指定一个脚本而非文件
-F执行systemtap的flight recorded 模式,并且指定在后台执行
参考文章:
SystemTap_Beginners_Guide