在上篇博客中,笔者介绍了如何三种常用的性能分析工具,其中就提到了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.FedoraCentOSRedhat上,可以通过下面的命令来安装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‘的程序

-esystemTap translator指定一个脚本而非文件

-F执行systemtapflight recorded 模式,并且指定在后台执行


参考文章:

SystemTap_Beginners_Guide